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

C プログラムの `stdout` から読み取るときに Python の `subprocess` がハングするのはなぜですか?

DDD
DDDオリジナル
2024-11-18 05:07:02564ブラウズ

Why Does My Python `subprocess` Hang When Reading from a C Program's `stdout`?

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

Python スクリプトから C プログラムを実行しようとすると、ユーザーがPython コードの「for line in iter」ステートメントでハングアップの問題が発生しました。これは、サブプロセスを使用して C プログラムの出力を読み取るときに発生します。この場合は、「2000」を出力し続けるテスト プログラムです。

問題の理解

このハング動作の根本原因は、標準出力バッファの管理にあります。デフォルトでは、C プログラムはブロックバッファされた出力を生成します。これは、データが大きなチャンクで stdout に書き込まれることを意味します。サブプロセスの場合と同様に、stdout がパイプにリダイレクトされる場合、このバッファリングにより出力の読み取りに遅延が生じる可能性があります。

解決策

1. C プログラムのバッファリングを変更する:

この問題を解決するには、ライン バッファリングされた標準出力を使用するように C プログラムを変更します。これにより、すべての新しい行が即座にフラッシュされ、バッファー関連の遅延が排除されます。

2.擬似 TTY を使用する:

別の解決策は、擬似端末 (pty) を使用することです。 PTY は C プログラムに疑似 tty インターフェイスを提供し、C プログラムが対話的に実行されていると思わせます。これにより、標準出力の行バッファリングが自然に有効になります。

3.特別なユーティリティを使用する:

stdbuf などのユーティリティを使用すると、ソース コードを変更せずにサブプロセスのバッファリング動作を変更できます。次の Python コードは、stdbuf の使用方法を示しています:

import subprocess

process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=PIPE, bufsize=1)
for line in iter(process.stdout.readline, b''):
    print(line)

4. pexpect を使用します:

Pexpect は、pty の処理を​​簡素化するモジュールです。これは次のように使用できます。

import pexpect

child = pexpect.spawn("./main")
for line in child:
    print(line)

これらのソリューションを実装すると、Python スクリプトは C プログラムの出力を即座に読み取ることができるようになります。これにより、「for line in iter」ステートメントでハングする問題が解決されます。

以上がC プログラムの `stdout` から読み取るときに Python の `subprocess` がハングするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。