6

stdinとstdoutを介して送受信されるメッセージを介して制御される外部プロセスを起動する必要があります。subprocess.Popenを使用してプロセスを開始することはできますが、必要に応じてstdinを介して実行を制御することはできません。

私が完了しようとしていることの流れは次のとおりです。

  1. 外部プロセスを開始します
  2. いくつかのステップを繰り返します
    1. stdinに改行文字を書き込んで、次の処理ステップを完了するように外部プロセスに指示します
    2. stdoutに改行文字を書き込んで、外部プロセスがステップの完了を通知するのを待ちます
  3. 外部プロセスのstdinを閉じて、実行が完了したことを外部プロセスに示します。

私はこれまでに次のことを思いついた:

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

上記のコードを実行すると、「\ n」は外部プロセスに伝達されず、ステップ#0を超えることはありません。コードはprocess.communicate()でブロックされ、それ以上先に進みません。通信()メソッドを間違って使用していますか?

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

4

2 に答える 2

9

process.communicate(input ='\ n')が間違っています。Pythonのドキュメントからわかるように、文字列を子のstdinに書き込み、子が終了するまで子からのすべての出力を読み取ります。doc.python.orgから:

Popen.communicate(input = None)プロセスとの対話:データをstdinに送信します。ファイルの終わりに達するまで、stdoutおよびstderrからデータを読み取ります。プロセスが終了するのを待ちます。オプションの入力引数は、子プロセスに送信される文字列である必要があります。データを子に送信する必要がない場合は、Noneである必要があります。

代わりに、子のstdinに書き込むだけです。次に、ループ内でそれを読み取ります。

もっと似たもの:

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()

これはあなたが望むもののような何かをするでしょう。

于 2009-07-06T16:18:06.507 に答える
0

react.spawnProcessLineReceiverを使用して、Twistedを使用できます。

于 2009-07-09T11:29:37.440 に答える