Python サブプロセスが「for line in iter」でハングする
このシナリオでは、Python スクリプトは C プログラムを実行し、その出力。ただし、スクリプトは「for line in iter(process.stdout.readline, '')」の行でハングします。
バッファリングの問題
問題の原因は次のとおりです。バッファリングの問題。 C プログラムでは、通常、出力がパイプされるときに stdout がブロック バッファーに入れられます。これは、一定量が書き込まれるか、改行が検出されるまで、出力がバッファリングされることを意味します。
C プログラムでは、while ループの各反復で「2000」が出力され、1 秒間スリープします。改行が出力されないため、出力はバッファリングされます。
Iter の行の場合
Python では、subprocess.stdout.readline() が子の stdout を読み取ります。処理して行を返します。 「for line in iter()」ループは、readline() によって返された行を反復処理します。
ただし、C プログラムの出力はバッファリングによりフラッシュされていないため、その時点では読み取る行はありません。ここで Python スクリプトがループに入ります。したがって、スクリプトはこの行で無限に待機します。
解決策
C プログラムのバッファリングを修正する
setvbuf(stdout, (char *) NULL, _IOLBF, 0);
stdbuf -oL ./main
Pseudo-TTY
import pty master_fd, slave_fd = pty.openpty() process = Popen("./main", stdin=slave_fd, stdout=slave_fd, stderr=STDOUT, bufsize=0, close_fds=True)
import pexpect child = pexpect.spawn("./main") for line in child: print line
これらの解決策のいずれかを適用すると、バッファリングの問題は解決されます。これにより、Python スクリプトが C プログラムの出力を期待どおりに読み取ることができるようになります。
以上が`for line in iter(process.stdout.readline, '')` を使用して C プログラムから出力を読み取るときに、Python の `subprocess` がハングするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。