Using subprocess.Popen
give more fine-grained control over launched processes than subprocess.call
.
process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
The signature for Popen
is very similar to the call
function; however, Popen
will return immediately instead of waiting for the subprocess to complete like call
does.
process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
process.wait()
process = subprocess.Popen([r'C:\path\to\app.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# This will block until process completes
stdout, stderr = process.communicate()
print stdout
print stderr
You can read and write on stdin
and stdout
even while the subprocess hasn't completed. This could be useful when automating functionality in another program.
process = subprocess.Popen([r'C:\path\to\app.exe'], stdout = subprocess.PIPE, stdin = subprocess.PIPE)
process.stdin.write('line of input\n') # Write input
line = process.stdout.readline() # Read a line from stdout
# Do logic on line read.
However, if you only need one set of input and output, rather than dynamic interaction,
you should use communicate()
rather than directly accessing stdin
and stdout
.
In case you want to see the output of a subprocess line by line, you can use the following snippet:
process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
output_line = process.stdout.readline()
in the case the subcommand output do not have EOL character, the above snippet does not work. You can then read the output character by character as follows:
process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
output_line = process.stdout.read(1)
The 1
specified as argument to the read
method tells read to read 1 character at time. You can specify to read as many characters you want using a different number. Negative number or 0 tells to read
to read as a single string until the EOF is encountered (see here).
In both the above snippets, the process.poll()
is None
until the subprocess finishes. This is used to exit the loop once there is no more output to read.
The same procedure could be applied to the stderr
of the subprocess.