Pythonを使用してStdin/Stdoutを介して外部プロセスの開始と制御

StackOverflow https://stackoverflow.com/questions/1087799

  •  23-08-2019
  •  | 
  •  

質問

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()でブロックされ、それ以上進行しません。 Communicate()メソッドを誤って使用していますか?

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

役に立ちましたか?

解決

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

popen.communicate(input = none)プロセスと相互作用:stdinにデータを送信します。ファイルの終わりに達するまで、StdoutとStderrのデータを読み取ります。プロセスが終了するのを待ちます。オプションの入力引数は、データを子に送信する必要がない場合は、子プロセスに送信される文字列である必要があります。

代わりに、子供の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()

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

他のヒント

使用して、Twistedを使用できます Reactor.SpawnProcessLinereceiver.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top