2

サブプロセスを使用する Python スクリプトを作成しています。主なアイデアは、特殊な子スクリプトを実行する 1 つの親スクリプトを持つことです。たとえば、他のプログラムを実行したり、独自に何かを実行したりします。親スクリプトとサブプロセスの間にパイプがあります。それらを使用して、定期的にいくつかの文字を送信し、応答を確認することにより、サブプロセスがまだ応答しているかどうかを制御します。問題は、サブプロセスが画面に何かを出力する (つまり、stdout または stderr に書き込む) ときに、パイプが破損し、すべてがクラッシュすることです。したがって、私の主な質問は、サブプロセスで std* への書き込みをブロックできるかどうかです。したがって、パイプに書き込まれた正当な応答のみが可能でしょうか? 私はすでにStop a function from write to stdout を試みましたが、成功しませんでした。

また、親プロセスとサブプロセス間の通信に関するその他のアイデアも歓迎します (ファイル ベースのパイプを除く)。ただし、サブプロセスを使用する必要があります。

4

2 に答える 2

1

「サブプロセスが画面に何かを出力する (つまり、stdout または stderr に書き込む) と、パイプが壊れてすべてがクラッシュする」ということを受け入れる必要はないと強く信じています。この問題を解決できます。次に、サブプロセスが標準ストリームに書き込むのを「ブロック」する必要はありません。

subprocess モジュールのすべての機能を適切に使用してください。まずsubprocess.PIPE、サブプロセスの各標準ストリームに a を接続します。

p = subprocess.Popen(
        [executable, arg1, arg2],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)

サブプロセスを実行し、これらのパイプを介して対話します。

stdout, stderr = p.communicate(stdin="command")

十分な柔軟性がない場合communicate()(同時に複数のサブプロセスを監視する必要がある場合、および/または特定のサブプロセスへの stdin データが前のコマンドへの応答としての出力に依存する場合)、p.stdout, p.stderr,p.stdin属性を直接操作できます。この場合、独自の監視ループを構築し、p.poll()and/orを利用する必要がありp.returncodeます。サブプロセスの制御は、 を介して実現することもできますp.send_signal()

于 2012-05-25T12:00:01.343 に答える
0

subprocess.Popen要求されたプログラムを実行する前に実行される関数を に渡すことができます。

def close_std():
    os.close(0)
    os.close(1)
    os.close(2)

p = subprocess.Popen(cmd, preexec_fn=close_std)

low-level os.close;の使用に注意してください。クローズsys.std*は、フォークされた Python プロセスでのみ効果があります。また、基になるプログラムが Python スクリプトである場合、クローズされたファイル記述子に書き込もうとすると、例外が原因で終了する可能性があることに注意してください。

于 2012-05-25T10:06:59.417 に答える