\section{\module{subprocess} --- Subprocess management}

\declaremodule{standard}{subprocess}
\modulesynopsis{Subprocess management.}
\moduleauthor{Peter \AA strand}{astrand@lysator.liu.se}
\sectionauthor{Peter \AA strand}{astrand@lysator.liu.se}

\versionadded{2.4}

The \module{subprocess} module allows you to spawn new processes,
connect to their input/output/error pipes, and obtain their return
codes.  This module intends to replace several other, older modules
and functions, such as:

\begin{verbatim}
os.system
os.spawn*
os.popen*
popen2.*
commands.*
\end{verbatim}

Information about how the \module{subprocess} module can be used to
replace these modules and functions can be found in the following
sections.

\subsection{Using the subprocess Module}

This module defines one class called \class{Popen}:

\begin{classdesc}{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}

Arguments are:

\var{args} should be a string, or a sequence of program arguments.  The
program to execute is normally the first item in the args sequence or
string, but can be explicitly set by using the executable argument.

On \UNIX{}, with \var{shell=False} (default): In this case, the Popen
class uses \method{os.execvp()} to execute the child program.
\var{args} should normally be a sequence.  A string will be treated as a
sequence with the string as the only item (the program to execute).

On \UNIX{}, with \var{shell=True}: If args is a string, it specifies the
command string to execute through the shell.  If \var{args} is a
sequence, the first item specifies the command string, and any
additional items will be treated as additional shell arguments.

On Windows: the \class{Popen} class uses CreateProcess() to execute
the child program, which operates on strings.  If \var{args} is a
sequence, it will be converted to a string using the
\method{list2cmdline} method.  Please note that not all MS Windows
applications interpret the command line the same way:
\method{list2cmdline} is designed for applications using the same
rules as the MS C runtime.

\var{bufsize}, if given, has the same meaning as the corresponding
argument to the built-in open() function: \constant{0} means unbuffered,
\constant{1} means line buffered, any other positive value means use a
buffer of (approximately) that size.  A negative \var{bufsize} means to
use the system default, which usually means fully buffered.  The default
value for \var{bufsize} is \constant{0} (unbuffered).

The \var{executable} argument specifies the program to execute. It is
very seldom needed: Usually, the program to execute is defined by the
\var{args} argument. If \code{shell=True}, the \var{executable}
argument specifies which shell to use. On \UNIX{}, the default shell
is \file{/bin/sh}.  On Windows, the default shell is specified by the
\envvar{COMSPEC} environment variable.

\var{stdin}, \var{stdout} and \var{stderr} specify the executed
programs' standard input, standard output and standard error file
handles, respectively.  Valid values are \code{PIPE}, an existing file
descriptor (a positive integer), an existing file object, and
\code{None}.  \code{PIPE} indicates that a new pipe to the child
should be created.  With \code{None}, no redirection will occur; the
child's file handles will be inherited from the parent.  Additionally,
\var{stderr} can be \code{STDOUT}, which indicates that the stderr
data from the applications should be captured into the same file
handle as for stdout.

If \var{preexec_fn} is set to a callable object, this object will be
called in the child process just before the child is executed.
(\UNIX{} only)

If \var{close_fds} is true, all file descriptors except \constant{0},
\constant{1} and \constant{2} will be closed before the child process is
executed. (\UNIX{} only)

If \var{shell} is \constant{True}, the specified command will be
executed through the shell.

If \var{cwd} is not \code{None}, the child's current directory will be
changed to \var{cwd} before it is executed.  Note that this directory
is not considered when searching the executable, so you can't specify
the program's path relative to \var{cwd}.

If \var{env} is not \code{None}, it defines the environment variables
for the new process.

If \var{universal_newlines} is \constant{True}, the file objects stdout
and stderr are opened as text files, but lines may be terminated by
any of \code{'\e n'}, the \UNIX{} end-of-line convention, \code{'\e r'},
the Macintosh convention or \code{'\e r\e n'}, the Windows convention.
All of these external representations are seen as \code{'\e n'} by the
Python program.  \note{This feature is only available if Python is built
with universal newline support (the default).  Also, the newlines
attribute of the file objects \member{stdout}, \member{stdin} and
\member{stderr} are not updated by the communicate() method.}

The \var{startupinfo} and \var{creationflags}, if given, will be
passed to the underlying CreateProcess() function.  They can specify
things such as appearance of the main window and priority for the new
process.  (Windows only)
\end{classdesc}

\subsubsection{Convenience Functions}

This module also defines two shortcut functions:

\begin{funcdesc}{call}{*popenargs, **kwargs}
Run command with arguments.  Wait for command to complete, then
return the \member{returncode} attribute.

The arguments are the same as for the Popen constructor.  Example:

\begin{verbatim}
    retcode = call(["ls", "-l"])
\end{verbatim}
\end{funcdesc}

\begin{funcdesc}{check_call}{*popenargs, **kwargs}
Run command with arguments.  Wait for command to complete. If the exit
code was zero then return, otherwise raise \exception{CalledProcessError.}
The \exception{CalledProcessError} object will have the return code in the
\member{returncode} attribute.

The arguments are the same as for the Popen constructor.  Example:

\begin{verbatim}
    check_call(["ls", "-l"])
\end{verbatim}
\end{funcdesc}

\subsubsection{Exceptions}

Exceptions raised in the child process, before the new program has
started to execute, will be re-raised in the parent.  Additionally,
the exception object will have one extra attribute called
\member{child_traceback}, which is a string containing traceback
information from the childs point of view.

The most common exception raised is \exception{OSError}.  This occurs,
for example, when trying to execute a non-existent file.  Applications
should prepare for \exception{OSError} exceptions.

A \exception{ValueError} will be raised if \class{Popen} is called
with invalid arguments.

check_call() will raise \exception{CalledProcessError}, if the called
process returns a non-zero return code.


\subsubsection{Security}

Unlike some other popen functions, this implementation will never call
/bin/sh implicitly.  This means that all characters, including shell
metacharacters, can safely be passed to child processes.


\subsection{Popen Objects}

Instances of the \class{Popen} class have the following methods:

\begin{methoddesc}{poll}{}
Check if child process has terminated.  Returns returncode
attribute.
\end{methoddesc}

\begin{methoddesc}{wait}{}
Wait for child process to terminate.  Returns returncode attribute.
\end{methoddesc}

\begin{methoddesc}{communicate}{input=None}
Interact with process: Send data to stdin.  Read data from stdout and
stderr, until end-of-file is reached.  Wait for process to terminate.
The optional \var{input} argument should be a string to be sent to the
child process, or \code{None}, if no data should be sent to the child.

communicate() returns a tuple (stdout, stderr).

\note{The data read is buffered in memory, so do not use this method
if the data size is large or unlimited.}
\end{methoddesc}

The following attributes are also available:

\begin{memberdesc}{stdin}
If the \var{stdin} argument is \code{PIPE}, this attribute is a file
object that provides input to the child process.  Otherwise, it is
\code{None}.
\end{memberdesc}

\begin{memberdesc}{stdout}
If the \var{stdout} argument is \code{PIPE}, this attribute is a file
object that provides output from the child process.  Otherwise, it is
\code{None}.
\end{memberdesc}

\begin{memberdesc}{stderr}
If the \var{stderr} argument is \code{PIPE}, this attribute is file
object that provides error output from the child process.  Otherwise,
it is \code{None}.
\end{memberdesc}

\begin{memberdesc}{pid}
The process ID of the child process.
\end{memberdesc}

\begin{memberdesc}{returncode}
The child return code.  A \code{None} value indicates that the process
hasn't terminated yet.  A negative value -N indicates that the child
was terminated by signal N (\UNIX{} only).
\end{memberdesc}


\subsection{Replacing Older Functions with the subprocess Module}

In this section, "a ==> b" means that b can be used as a replacement
for a.

\note{All functions in this section fail (more or less) silently if
the executed program cannot be found; this module raises an
\exception{OSError} exception.}

In the following examples, we assume that the subprocess module is
imported with "from subprocess import *".

\subsubsection{Replacing /bin/sh shell backquote}

\begin{verbatim}
output=`mycmd myarg`
==>
output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
\end{verbatim}

\subsubsection{Replacing shell pipe line}

\begin{verbatim}
output=`dmesg | grep hda`
==>
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
\end{verbatim}

\subsubsection{Replacing os.system()}

\begin{verbatim}
sts = os.system("mycmd" + " myarg")
==>
p = Popen("mycmd" + " myarg", shell=True)
sts = os.waitpid(p.pid, 0)
\end{verbatim}

Notes:

\begin{itemize}
\item Calling the program through the shell is usually not required.
\item It's easier to look at the \member{returncode} attribute than
      the exit status.
\end{itemize}

A more realistic example would look like this:

\begin{verbatim}
try:
    retcode = call("mycmd" + " myarg", shell=True)
    if retcode < 0:
        print >>sys.stderr, "Child was terminated by signal", -retcode
    else:
        print >>sys.stderr, "Child returned", retcode
except OSError, e:
    print >>sys.stderr, "Execution failed:", e
\end{verbatim}

\subsubsection{Replacing os.spawn*}

P_NOWAIT example:

\begin{verbatim}
pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
==>
pid = Popen(["/bin/mycmd", "myarg"]).pid
\end{verbatim}

P_WAIT example:

\begin{verbatim}
retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
==>
retcode = call(["/bin/mycmd", "myarg"])
\end{verbatim}

Vector example:

\begin{verbatim}
os.spawnvp(os.P_NOWAIT, path, args)
==>
Popen([path] + args[1:])
\end{verbatim}

Environment example:

\begin{verbatim}
os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
==>
Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
\end{verbatim}

\subsubsection{Replacing os.popen*}

\begin{verbatim}
pipe = os.popen(cmd, mode='r', bufsize)
==>
pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
\end{verbatim}

\begin{verbatim}
pipe = os.popen(cmd, mode='w', bufsize)
==>
pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
\end{verbatim}

\begin{verbatim}
(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdin, child_stdout) = (p.stdin, p.stdout)
\end{verbatim}

\begin{verbatim}
(child_stdin,
 child_stdout,
 child_stderr) = os.popen3(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
(child_stdin,
 child_stdout,
 child_stderr) = (p.stdin, p.stdout, p.stderr)
\end{verbatim}

\begin{verbatim}
(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
\end{verbatim}

\subsubsection{Replacing popen2.*}

\note{If the cmd argument to popen2 functions is a string, the command
is executed through /bin/sh.  If it is a list, the command is directly
executed.}

\begin{verbatim}
(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
==>
p = Popen(["somestring"], shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)
\end{verbatim}

\begin{verbatim}
(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
==>
p = Popen(["mycmd", "myarg"], bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)
\end{verbatim}

The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen,
except that:

\begin{itemize}
\item subprocess.Popen raises an exception if the execution fails

\item the \var{capturestderr} argument is replaced with the \var{stderr}
      argument.

\item stdin=PIPE and stdout=PIPE must be specified.

\item popen2 closes all file descriptors by default, but you have to
      specify close_fds=True with subprocess.Popen.
\end{itemize}
