2009-07-06 13 views
4

stdinとstdoutを経由して前後に送られるメッセージによって制御される外部プロセスを起動する必要があります。 Subprocess.Popenを使用して、プロセスを開始することができますが、必要に応じてstdin経由で実行を制御することができません。STDIN/STDOUTによるPythonによる外部プロセスの開始と制御

私が完了しようとしているものの流れがにある:ステップ

  1. のいくつかの数のための外部プロセス
  2. 反復は、次の処理を完了するために、外部プロセスを知らせる

    1. スタート新しい行の文字をstdinに書き込むことによってステップする
    2. 外部プロセスが、ステップの完了を知らせるのを待って、改行文字をstdoutに書き込むことで
  3. 実行が完了したことを外部プロセスに示すために、外部プロセスのstdinを閉じます。私は「\ nを」外部プロセスに伝達されていない上記のコードを実行し、私はステップ#0を超えて取得することはありません場合は

    process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE); 
    for i in xrange(StepsToComplete): 
        print "Forcing step # %s"%i 
        process.communicate(input='\n') 
    

    :私は今のところ、以下が出ている

。コードはprocess.communicate()でブロックされ、それ以上は進めません。私は、commun()メソッドを間違って使用していますか?

また、「外部プロセスが新しい行を書き込むまで待機する」機能を実装するにはどうすればよいですか?

答えて

8

process.communicate(入力= '\ n')が間違っています。 Pythonのドキュメントから気づくと、あなたの文字列を子のstdinに書き込んだ後、子が終了するまでその子からのすべての出力を読み込みます。 doc.python.orgから:

Popen.communicate(input =なし)プロセスとのインタラクション :データをstdinに送信します。ファイル末尾が に達するまで、stdoutとstderrの データを読み込みます。 プロセスが終了するまで待ちます。オプションの 入力引数は、 子プロセスに送信する文字列、または 子に送信するデータがない場合は、なし、 の文字列にする必要があります。

代わりに、子の標準入力に書き込むだけです。それからあなたのループでそれを読んでください。

以上のような何か:

process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE); 
for i in xrange(StepsToComplete): 
    print "Forcing step # %s"%i 
    process.stdin.write("\n") 
    result=process.stdout.readline() 

これは、より多くのあなたが望むようなことを行います。

+3

最初にこれをしたときに私に噛み砕く何かは、あなたが何人かのキャラクターしか送っていないなら、何かが伝わる前にストリームを洗い流さなければならないかもしれないということでした。 – Kiv

関連する問題