サブプロセスを使用して Python で C プログラムを実行すると、出力を読み取る際に注意が必要になることがあります。 C プログラム。この場合、Python スクリプトは「for line in iter(process.stdout.readline, '')」でフリーズします。
ここでの問題はバッファリングです。デフォルトでは、C プログラムはパイプに書き込むときに標準出力にブロック バッファリングを使用します (Python からプログラムを実行する場合と同様)。これは、バッファがいっぱいになるかプログラムが終了するまでデータはフラッシュされないことを意味します。
この問題に対処するには、いくつかの方法があります。
1. C プログラムを変更します。
setvbuf(stdout, (char *) NULL, _IOLBF, 0); を追加します。 C プログラムの先頭で行バッファリングを強制します。これにより、各改行の後にバッファがフラッシュされます。
2. stdbuf ツールの使用:
stdbuf ツールを通じて C プログラムの stdout をリダイレクトし、バッファリング動作を制御します。例:
import subprocess process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=subprocess.PIPE, bufsize=1) for line in iter(process.stdout.readline, ''): print(line)
3.擬似 TTY を使用する:
擬似 TTY を使用して、C プログラムの対話型ターミナル環境をシミュレートします。これにより、プログラムは行バッファリングを使用するように強制されます。
import pexpect child = pexpect.spawn("./main") for line in child: print(line)
4.両端から読み取り:
Python の select 関数を使用して、C プログラムの stdout と Python スクリプトの stdin の両方から同時に読み取ります。これにより、C プログラムが出力を生成していない場合でも、Python スクリプトのブロックが解除されます。
以上がC プログラムから出力を読み取るときに Python サブプロセスがハングするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。