jonathan topf jonathan topf - 1 year ago 108
Python Question

How do I write to a Python subprocess' stdin?

I'm trying to write a Python script that starts a subprocess, and writes to the subprocess stdin. I'd also like to be able to determine an action to be taken if the subprocess crashes.

The process I'm trying to start is a program called

nuke
which has its own built-in version of Python which I'd like to be able to submit commands to, and then tell it to quit after the commands execute. So far I've worked out that if I start Python on the command prompt like and then start
nuke
as a subprocess then I can type in commands to
nuke
, but I'd like to be able to put this all in a script so that the master Python program can start
nuke
and then write to its standard input (and thus into its built-in version of Python) and tell it to do snazzy things, so I wrote a script that starts
nuke
like this:

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


Then nothing happens because
nuke
is waiting for user input. How would I now write to standard input?

I'm doing this because I'm running a plugin with
nuke
that causes it to crash intermittently when rendering multiple frames. So I'd like this script to be able to start
nuke
, tell it to do something and then if it crashes, try again. So if there is a way to catch a crash and still be OK then that'd be great.

jro jro
Answer Source

It might be better to use 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", because of this warning:

Use communicate() rather than .stdin.write, .stdout.read or .stderr.read to avoid deadlocks due to any of the other OS pipe buffers filling up and blocking the child process.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download