ホームページ > バックエンド開発 > Python チュートリアル > C プログラムから出力を読み取るときに Python サブプロセスがハングするのはなぜですか?

C プログラムから出力を読み取るときに Python サブプロセスがハングするのはなぜですか?

Linda Hamilton
リリース: 2024-11-19 00:57:02
オリジナル
766 人が閲覧しました

Why Does My Python Subprocess Hang When Reading Output from a C Program?

Python C プログラムのサブプロセスが「for line in iter」でハングする

サブプロセスを使用して 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 サイトの他の関連記事を参照してください。

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