81

サブプロセスを開始し、サブプロセスの stdin に書き込む Python スクリプトを作成しようとしています。また、サブプロセスがクラッシュした場合に実行するアクションを決定できるようにしたいと考えています。

私が開始しようとしているプロセスは、nukeコマンドを送信し、コマンドの実行後に終了するように指示したい独自の組み込みバージョンの Python を持つプログラムです。これまでのところ、コマンド プロンプトで Python を起動nukeし、サブプロセスとして起動すると、 にコマンドを入力できることがわかりましたnukeが、これをすべてスクリプトに入れて、マスターがPython プログラムは、起動nukeして標準入力(つまり組み込みバージョンの Python) に書き込み、おしゃれなことをするように指示することができるので、次のように開始するスクリプトを作成しnukeました。

subprocess.call(["C:/Program Files/Nuke6.3v5/Nuke6.3", "-t", "E:/NukeTest/test.nk"])

nukeはユーザーの入力を待っているため、何も起こりません。標準入力に書き込むにはどうすればよいですか?

nuke複数のフレームをレンダリングするときに断続的にクラッシュするプラグインを実行しているため、これを行っています。したがって、このスクリプトを開始nukeして、何かを実行するように指示し、クラッシュした場合は再試行できるようにしたいと思います。したがって、クラッシュをキャッチしても問題ない方法があれば、それは素晴らしいことです。

4

3 に答える 3

102

使用する方が良いかもしれませんcommunicate

from subprocess import Popen, PIPE, STDOUT
p = Popen(['myapp'], stdout=PIPE, stdin=PIPE, stderr=PIPE)
stdout_data = p.communicate(input='data_to_write')[0]

この警告のため、「より良い」:

.stdin.write、.stdout.read、または .stderr.read ではなく、communicate() を使用して、他の OS パイプ バッファがいっぱいになり、子プロセスをブロックすることによるデッドロックを回避します。

于 2011-12-12T13:52:56.407 に答える
-2

stdinの引数にファイルのようなオブジェクトを指定できますsubprocess.call()

オブジェクトのドキュメントはここに適用されます。Popen

出力を取得するにはsubprocess.check_output()、同様の引数を取る を代わりに使用する必要があります。ドキュメントから:

>>> subprocess.check_output(
...     "ls non_existent_file; exit 0",
...     stderr=subprocess.STDOUT,
...     shell=True)
'ls: non_existent_file: No such file or directory\n'
于 2011-12-12T13:48:59.900 に答える