
Python サブプロセス Readlines() がハングします
問題ステートメント:
ストリーミングしようとしたときサブプロセス モジュール、readlines() 呼び出しブロックを使用して、Python で Ruby ファイルを 1 行ずつ実行する
原因:
この問題は、Linux 以外のオペレーティング システムで pty モジュールを使用して擬似端末をシミュレートするときに発生する可能性があります。 pty は Linux 固有のライブラリであり、他のシステムでの動作は保証されていません。
解決策:
1. Pexpect を使用します:
Pexpect は、対話型アプリケーションを自動化するために設計されたクロスプラットフォーム ライブラリです。擬似端末を介してデータを送受信するための高レベルのインターフェイスを提供します。
1 2 3 | import pexpect
pexpect.run( "ruby ruby_sleep.rb" , logfile=sys.stdout)
|
ログイン後にコピー
2. Stdbuf を使用する:
Stdbuf を使用すると、非対話モードでライン バッファリングを有効にし、出力を行ごとにフラッシュできます。
1 2 3 4 5 6 | proc = Popen([ 'stdbuf' , '-oL' , 'ruby' , 'ruby_sleep.rb' ],
bufsize=1, stdout=PIPE, stderr=STDOUT, close_fds=True)
for line in iter(proc.stdout.readline, b '' ):
print (line)
proc.stdout.close()
proc.wait()
|
ログイン後にコピー
3.標準ライブラリの Pty を使用する (Linux 用):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import errno
import os
import pty
from subprocess import Popen, STDOUT
master_fd, slave_fd = pty.openpty() # provide tty to enable line-buffering on Ruby's side
proc = Popen([ 'ruby' , 'ruby_sleep.rb' ],
stdin=slave_fd, stdout=slave_fd, stderr=STDOUT, close_fds=True)
os.close(slave_fd)
try :
while 1:
try :
data = os.read(master_fd, 512)
except OSError as e:
if e.errno != errno.EIO:
raise
break # EIO means EOF on some systems
else :
if not data: # EOF
break
print ( 'got ' + repr(data))
finally:
os.close(master_fd)
if proc.poll() is None:
proc.kill()
proc.wait()
print ( "This is reached!" )
|
ログイン後にコピー
以上がRuby 出力をストリーミングするときに Python の「subprocess.readlines()」がハングするのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。