cinap_lenrekadd hg and python4bb9e2215 years agoHistory
402 lines · 13.1 KB · TeX
RawDownload
\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 returncodes.  This module intends to replace several other, older modulesand functions, such as: \begin{verbatim}os.systemos.spawn*os.popen*popen2.*commands.*\end{verbatim} Information about how the \module{subprocess} module can be used toreplace these modules and functions can be found in the followingsections. \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.  Theprogram to execute is normally the first item in the args sequence orstring, but can be explicitly set by using the executable argument. On \UNIX{}, with \var{shell=False} (default): In this case, the Popenclass uses \method{os.execvp()} to execute the child program.\var{args} should normally be a sequence.  A string will be treated as asequence with the string as the only item (the program to execute). On \UNIX{}, with \var{shell=True}: If args is a string, it specifies thecommand string to execute through the shell.  If \var{args} is asequence, the first item specifies the command string, and anyadditional items will be treated as additional shell arguments. On Windows: the \class{Popen} class uses CreateProcess() to executethe child program, which operates on strings.  If \var{args} is asequence, it will be converted to a string using the\method{list2cmdline} method.  Please note that not all MS Windowsapplications interpret the command line the same way:\method{list2cmdline} is designed for applications using the samerules as the MS C runtime. \var{bufsize}, if given, has the same meaning as the correspondingargument to the built-in open() function: \constant{0} means unbuffered,\constant{1} means line buffered, any other positive value means use abuffer of (approximately) that size.  A negative \var{bufsize} means touse the system default, which usually means fully buffered.  The defaultvalue for \var{bufsize} is \constant{0} (unbuffered). The \var{executable} argument specifies the program to execute. It isvery 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 shellis \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 executedprograms' standard input, standard output and standard error filehandles, respectively.  Valid values are \code{PIPE}, an existing filedescriptor (a positive integer), an existing file object, and\code{None}.  \code{PIPE} indicates that a new pipe to the childshould be created.  With \code{None}, no redirection will occur; thechild's file handles will be inherited from the parent.  Additionally,\var{stderr} can be \code{STDOUT}, which indicates that the stderrdata from the applications should be captured into the same filehandle as for stdout. If \var{preexec_fn} is set to a callable object, this object will becalled 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 isexecuted. (\UNIX{} only) If \var{shell} is \constant{True}, the specified command will beexecuted through the shell. If \var{cwd} is not \code{None}, the child's current directory will bechanged to \var{cwd} before it is executed.  Note that this directoryis not considered when searching the executable, so you can't specifythe program's path relative to \var{cwd}. If \var{env} is not \code{None}, it defines the environment variablesfor the new process. If \var{universal_newlines} is \constant{True}, the file objects stdoutand stderr are opened as text files, but lines may be terminated byany 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 thePython program.  \note{This feature is only available if Python is builtwith universal newline support (the default).  Also, the newlinesattribute 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 bepassed to the underlying CreateProcess() function.  They can specifythings such as appearance of the main window and priority for the newprocess.  (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, thenreturn 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 exitcode 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 hasstarted 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 tracebackinformation 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.  Applicationsshould prepare for \exception{OSError} exceptions. A \exception{ValueError} will be raised if \class{Popen} is calledwith invalid arguments. check_call() will raise \exception{CalledProcessError}, if the calledprocess 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 shellmetacharacters, 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 returncodeattribute.\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 andstderr, until end-of-file is reached.  Wait for process to terminate.The optional \var{input} argument should be a string to be sent to thechild 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 methodif 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 fileobject 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 fileobject 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 fileobject 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 processhasn't terminated yet.  A negative value -N indicates that the childwas 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 replacementfor a. \note{All functions in this section fail (more or less) silently ifthe executed program cannot be found; this module raises an\exception{OSError} exception.} In the following examples, we assume that the subprocess module isimported 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", retcodeexcept 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 commandis executed through /bin/sh.  If it is a list, the command is directlyexecuted.} \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}