ホームページ > バックエンド開発 > Python チュートリアル > `for line in iter(process.stdout.readline, \'\')` を使用して C プログラムから出力を読み取るときに、Python の `subprocess` がハングするのはなぜですか?

`for line in iter(process.stdout.readline, \'\')` を使用して C プログラムから出力を読み取るときに、Python の `subprocess` がハングするのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-18 05:23:02
オリジナル
735 人が閲覧しました

Why Does My Python `subprocess` Hang When Reading Output from a C Program Using `for line in iter(process.stdout.readline, '')`?

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(): C プログラムは次を使用できます。 setvbuf() を使用して、標準出力の行バッファリングを強制します。これにより、各行が印刷直後に確実にフラッシュされます。
setvbuf(stdout, (char *) NULL, _IOLBF, 0);
ログイン後にコピー
  • stdbuf ユーティリティ: stdbuf ユーティリティを使用して、C プログラムをラップし、そのプログラムを変更できます。バッファリング
stdbuf -oL ./main
ログイン後にコピー

Pseudo-TTY

  • Pty モジュール: pty モジュールを使用して、 C プログラムを騙して対話的に実行していると思わせる疑似 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)
ログイン後にコピー
  • pexpect ライブラリ: pexpect ライブラリは、pty を操作するための高レベルのインターフェイスを提供します。
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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート