1. ホーム
  2. python

Python のサブプロセスの標準入力に書き込むにはどうしたらいいですか?

2023-08-06 08:32:14

質問

サブプロセスを開始し、サブプロセスの標準入力に書き込む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 を起動し、何かをするように指示し、もしクラッシュしたら、もう一度試してみてください。ですから、もしクラッシュをキャッチしてまだ大丈夫な方法があれば、それは素晴らしいことです。

どのように解決するのですか?

それは 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]

"Better"、この警告のためです。

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