Pythonを使用してStdin/Stdoutを介して外部プロセスの開始と制御
-
23-08-2019 - |
質問
StdinとStdoutを介して送信されたメッセージを介して制御される外部プロセスを起動する必要があります。 subprocess.popenを使用すると、プロセスを開始できますが、必要に応じてstdinを介して実行を制御することはできません。
私が完了しようとしていることの流れは次のとおりです。
- 外部プロセスを開始します
- いくつかのステップを反復します
- 外部プロセスに、次の処理ステップを完了して、stdinに新しいライン文字を作成して、次の処理ステップを完了するようにします
- 外部プロセスが信号を送るのを待つことは、そのstdoutに新しいライン文字を書くことでステップを完了しました
- 外部プロセスの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.SpawnProcess と Linereceiver.