The standard library provides a number of ways to execute a subprocess, offering different features and different levels of complexity. os.system(command) is easy to use, but slow (it runs a shell process which executes the command) and dangerous (you have to be careful about escaping the shell's metacharacters). The popen2 module offers classes that can capture standard output and standard error from the subprocess, but the naming is confusing. The subprocess module cleans this up, providing a unified interface that offers all the features you might need.
Instead of popen2's collection of classes, subprocess contains a single class called Popen whose constructor supports a number of different keyword arguments.
class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0):
args is commonly a sequence of strings that will be the arguments to the program executed as the subprocess. (If the shell argument is true, args can be a string which will then be passed on to the shell for interpretation, just as os.system() does.)
stdin, stdout, and stderr specify what the
subprocess's input, output, and error streams will be. You can
provide a file object or a file descriptor, or you can use the
constant subprocess.PIPE
to create a pipe between the
subprocess and the parent.
The constructor has a number of handy options:
Once you've created the Popen instance,
you can call its wait() method to pause until the subprocess
has exited, poll() to check if it's exited without pausing,
or communicate(data) to send the string data to
the subprocess's standard input. communicate(data)
then reads any data that the subprocess has sent to its standard output
or standard error, returning a tuple (stdout_data,
stderr_data)
.
call() is a shortcut that passes its arguments along to the Popen constructor, waits for the command to complete, and returns the status code of the subprocess. It can serve as a safer analog to os.system():
sts = subprocess.call(['dpkg', '-i', '/tmp/new-package.deb']) if sts == 0: # Success ... else: # dpkg returned an error ...
The command is invoked without use of the shell. If you really do want to
use the shell, you can add shell=True
as a keyword argument and provide
a string instead of a sequence:
sts = subprocess.call('dpkg -i /tmp/new-package.deb', shell=True)
The PEP takes various examples of shell and Python code and shows how they'd be translated into Python code that uses subprocess. Reading this section of the PEP is highly recommended.
See Also:
See About this document... for information on suggesting changes.