17.5.subprocess — Subprocess management¶
Source code:Lib/subprocess.py
Thesubprocess module allows you to spawn new processes, connect to theirinput/output/error pipes, and obtain their return codes. This module intends toreplace several older modules and functions:
os.systemos.spawn*
Information about how thesubprocess module can be used to replace thesemodules and functions can be found in the following sections.
See also
PEP 324 – PEP proposing the subprocess module
17.5.1. Using thesubprocess Module¶
The recommended approach to invoking subprocesses is to use therun()function for all use cases it can handle. For more advanced use cases, theunderlyingPopen interface can be used directly.
Therun() function was added in Python 3.5; if you need to retaincompatibility with older versions, see theOlder high-level API section.
subprocess.run(args,*,stdin=None,input=None,stdout=None,stderr=None,shell=False,timeout=None,check=False)¶Run the command described byargs. Wait for command to complete, thenreturn a
CompletedProcessinstance.The arguments shown above are merely the most common ones, described belowinFrequently Used Arguments (hence the use of keyword-only notationin the abbreviated signature). The full function signature is largely thesame as that of the
Popenconstructor - apart fromtimeout,input andcheck, all the arguments to this function are passed through tothat interface.This does not capture stdout or stderr by default. To do so, pass
PIPEfor thestdout and/orstderr arguments.Thetimeout argument is passed to
Popen.communicate(). If the timeoutexpires, the child process will be killed and waited for. TheTimeoutExpiredexception will be re-raised after the child processhas terminated.Theinput argument is passed to
Popen.communicate()and thus to thesubprocess’s stdin. If used it must be a byte sequence, or a string ifuniversal_newlines=True. When used, the internalPopenobjectis automatically created withstdin=PIPE, and thestdin argument maynot be used as well.Ifcheck is true, and the process exits with a non-zero exit code, a
CalledProcessErrorexception will be raised. Attributes of thatexception hold the arguments, the exit code, and stdout and stderr if theywere captured.Examples:
>>>subprocess.run(["ls","-l"])# doesn't capture outputCompletedProcess(args=['ls', '-l'], returncode=0)>>>subprocess.run("exit 1",shell=True,check=True)Traceback (most recent call last):...subprocess.CalledProcessError:Command 'exit 1' returned non-zero exit status 1>>>subprocess.run(["ls","-l","/dev/null"],stdout=subprocess.PIPE)CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
New in version 3.5.
- class
subprocess.CompletedProcess¶ The return value from
run(), representing a process that has finished.args¶The arguments used to launch the process. This may be a list or a string.
returncode¶Exit status of the child process. Typically, an exit status of 0 indicatesthat it ran successfully.
A negative value
-Nindicates that the child was terminated by signalN(POSIX only).
stdout¶Captured stdout from the child process. A bytes sequence, or a string if
run()was called withuniversal_newlines=True.Noneif stdoutwas not captured.If you ran the process with
stderr=subprocess.STDOUT, stdout andstderr will be combined in this attribute, andstderrwill beNone.
stderr¶Captured stderr from the child process. A bytes sequence, or a string if
run()was called withuniversal_newlines=True.Noneif stderrwas not captured.
check_returncode()¶If
returncodeis non-zero, raise aCalledProcessError.
New in version 3.5.
subprocess.DEVNULL¶Special value that can be used as thestdin,stdout orstderr argumentto
Popenand indicates that the special fileos.devnullwill be used.New in version 3.3.
subprocess.PIPE¶Special value that can be used as thestdin,stdout orstderr argumentto
Popenand indicates that a pipe to the standard stream should beopened. Most useful withPopen.communicate().
subprocess.STDOUT¶Special value that can be used as thestderr argument to
Popenandindicates that standard error should go into the same handle as standardoutput.
- exception
subprocess.SubprocessError¶ Base class for all other exceptions from this module.
New in version 3.3.
- exception
subprocess.TimeoutExpired¶ Subclass of
SubprocessError, raised when a timeout expireswhile waiting for a child process.cmd¶Command that was used to spawn the child process.
timeout¶Timeout in seconds.
output¶Output of the child process if it was captured by
run()orcheck_output(). Otherwise,None.
New in version 3.3.
Changed in version 3.5:stdout andstderr attributes added
- exception
subprocess.CalledProcessError¶ Subclass of
SubprocessError, raised when a process run bycheck_call()orcheck_output()returns a non-zero exit status.returncode¶Exit status of the child process. If the process exited due to asignal, this will be the negative signal number.
cmd¶Command that was used to spawn the child process.
output¶Output of the child process if it was captured by
run()orcheck_output(). Otherwise,None.
Changed in version 3.5:stdout andstderr attributes added
17.5.1.1. Frequently Used Arguments¶
To support a wide variety of use cases, thePopen constructor (andthe convenience functions) accept a large number of optional arguments. Formost typical use cases, many of these arguments can be safely left at theirdefault values. The arguments that are most commonly needed are:
args is required for all calls and should be a string, or a sequence ofprogram arguments. Providing a sequence of arguments is generallypreferred, as it allows the module to take care of any required escapingand quoting of arguments (e.g. to permit spaces in file names). If passinga single string, eithershell must be
True(see below) or elsethe string must simply name the program to be executed without specifyingany arguments.stdin,stdout andstderr specify the executed program’s standard input,standard output and standard error file handles, respectively. Valid valuesare
PIPE,DEVNULL, an existing file descriptor (a positiveinteger), an existing file object, andNone.PIPEindicatesthat a new pipe to the child should be created.DEVNULLindicatesthat the special fileos.devnullwill be used. With the defaultsettings ofNone, no redirection will occur; the child’s file handleswill be inherited from the parent. Additionally,stderr can beSTDOUT, which indicates that the stderr data from the childprocess should be captured into the same file handle as forstdout.Ifuniversal_newlines is
Falsethe file objectsstdin,stdout andstderr will be opened as binary streams, and no line ending conversion isdone.Ifuniversal_newlines is
True, these file objectswill be opened as text streams inuniversal newlines modeusing the encoding returned bylocale.getpreferredencoding(False). Forstdin, line ending characters'\n'in the input will be converted to the default line separatoros.linesep. Forstdout andstderr, all line endings in theoutput will be converted to'\n'. For more information see thedocumentation of theio.TextIOWrapperclass when thenewlineargument to its constructor isNone.Note
The newlines attribute of the file objects
Popen.stdin,Popen.stdoutandPopen.stderrare not updated bythePopen.communicate()method.Ifshell is
True, the specified command will be executed throughthe shell. This can be useful if you are using Python primarily for theenhanced control flow it offers over most system shells and still wantconvenient access to other shell features such as shell pipes, filenamewildcards, environment variable expansion, and expansion of~to auser’s home directory. However, note that Python itself offersimplementations of many shell-like features (in particular,glob,fnmatch,os.walk(),os.path.expandvars(),os.path.expanduser(), andshutil).Changed in version 3.3:Whenuniversal_newlines is
True, the class uses the encodinglocale.getpreferredencoding(False)instead oflocale.getpreferredencoding(). See theio.TextIOWrapperclass for more information on this change.Note
Read theSecurity Considerations section before using
shell=True.
These options, along with all of the other options, are described in moredetail in thePopen constructor documentation.
17.5.1.2. Popen Constructor¶
The underlying process creation and management in this module is handled bythePopen class. It offers a lot of flexibility so that developersare able to handle the less common cases not covered by the conveniencefunctions.
- class
subprocess.Popen(args,bufsize=-1,executable=None,stdin=None,stdout=None,stderr=None,preexec_fn=None,close_fds=True,shell=False,cwd=None,env=None,universal_newlines=False,startupinfo=None,creationflags=0,restore_signals=True,start_new_session=False,pass_fds=())¶ Execute a child program in a new process. On POSIX, the class uses
os.execvp()-like behavior to execute the child program. On Windows,the class uses the WindowsCreateProcess()function. The arguments toPopenare as follows.args should be a sequence of program arguments or else a single string.By default, the program to execute is the first item inargs ifargs isa sequence. Ifargs is a string, the interpretation isplatform-dependent and described below. See theshell andexecutablearguments for additional differences from the default behavior. Unlessotherwise stated, it is recommended to passargs as a sequence.
On POSIX, ifargs is a string, the string is interpreted as the name orpath of the program to execute. However, this can only be done if notpassing arguments to the program.
Note
shlex.split()can be useful when determining the correcttokenization forargs, especially in complex cases:>>>importshlex,subprocess>>>command_line=input()/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'">>>args=shlex.split(command_line)>>>print(args)['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]>>>p=subprocess.Popen(args)# Success!
Note in particular that options (such as-input) and arguments (suchaseggs.txt) that are separated by whitespace in the shell go in separatelist elements, while arguments that need quoting or backslash escaping whenused in the shell (such as filenames containing spaces or theecho commandshown above) are single list elements.
On Windows, ifargs is a sequence, it will be converted to a string in amanner described inConverting an argument sequence to a string on Windows. This is becausethe underlying
CreateProcess()operates on strings.Theshell argument (which defaults to
False) specifies whether to usethe shell as the program to execute. Ifshell isTrue, it isrecommended to passargs as a string rather than as a sequence.On POSIX with
shell=True, the shell defaults to/bin/sh. Ifargs is a string, the string specifies the commandto execute through the shell. This means that the string must beformatted exactly as it would be when typed at the shell prompt. Thisincludes, for example, quoting or backslash escaping filenames with spaces inthem. Ifargs is a sequence, the first item specifies the command string, andany additional items will be treated as additional arguments to the shellitself. That is to say,Popendoes the equivalent of:Popen(['/bin/sh','-c',args[0],args[1],...])
On Windows with
shell=True, theCOMSPECenvironment variablespecifies the default shell. The only time you need to specifyshell=Trueon Windows is when the command you wish to execute is builtinto the shell (e.g.dir orcopy). You do not needshell=Trueto run a batch file or console-based executable.Note
Read theSecurity Considerations section before using
shell=True.bufsize will be supplied as the corresponding argument to the
open()function when creating the stdin/stdout/stderr pipefile objects:0means unbuffered (read and write are onesystem call and can return short)1means line buffered(only usable ifuniversal_newlines=Truei.e., in a text mode)- any other positive value means use a buffer of approximately thatsize
- negative bufsize (the default) means the system default ofio.DEFAULT_BUFFER_SIZE will be used.
Changed in version 3.3.1:bufsize now defaults to -1 to enable buffering by default to match thebehavior that most code expects. In versions prior to Python 3.2.4 and3.3.1 it incorrectly defaulted to
0which was unbufferedand allowed short reads. This was unintentional and did not match thebehavior of Python 2 as most code expected.Theexecutable argument specifies a replacement program to execute. Itis very seldom needed. When
shell=False,executable replaces theprogram to execute specified byargs. However, the originalargs isstill passed to the program. Most programs treat the program specifiedbyargs as the command name, which can then be different from the programactually executed. On POSIX, theargs namebecomes the display name for the executable in utilities such asps. Ifshell=True, on POSIX theexecutable argumentspecifies a replacement shell for the default/bin/sh.stdin,stdout andstderr specify the executed program’s standard input,standard output and standard error file handles, respectively. Valid valuesare
PIPE,DEVNULL, an existing file descriptor (a positiveinteger), an existingfile object, andNone.PIPEindicates that a new pipe to the child should be created.DEVNULLindicates that the special fileos.devnullwill be used. With thedefault settings ofNone, no redirection will occur; the child’s filehandles will be inherited from the parent. Additionally,stderr can beSTDOUT, which indicates that the stderr data from the applicationsshould be captured into the same file handle as for stdout.Ifpreexec_fn is set to a callable object, this object will be called in thechild process just before the child is executed.(POSIX only)
Warning
Thepreexec_fn parameter is not safe to use in the presence of threadsin your application. The child process could deadlock before exec iscalled.If you must use it, keep it trivial! Minimize the number of librariesyou call into.
Note
If you need to modify the environment for the child use theenvparameter rather than doing it in apreexec_fn.Thestart_new_session parameter can take the place of a previouslycommon use ofpreexec_fn to call os.setsid() in the child.
Ifclose_fds is true, all file descriptors except
0,1and2will be closed before the child process is executed. (POSIX only).The default varies by platform: Always true on POSIX. On Windows it istrue whenstdin/stdout/stderr areNone, false otherwise.On Windows, ifclose_fds is true then no handles will be inherited by thechild process. Note that on Windows, you cannot setclose_fds to true andalso redirect the standard handles by settingstdin,stdout orstderr.Changed in version 3.2:The default forclose_fds was changed from
Falsetowhat is described above.pass_fds is an optional sequence of file descriptors to keep openbetween the parent and child. Providing anypass_fds forcesclose_fds to be
True. (POSIX only)New in version 3.2:Thepass_fds parameter was added.
Ifcwd is not
None, the function changes the working directory tocwd before executing the child. In particular, the function looks forexecutable (or for the first item inargs) relative tocwd if theexecutable path is a relative path.Ifrestore_signals is true (the default) all signals that Python has set toSIG_IGN are restored to SIG_DFL in the child process before the exec.Currently this includes the SIGPIPE, SIGXFZ and SIGXFSZ signals.(POSIX only)
Changed in version 3.2:restore_signals was added.
Ifstart_new_session is true the setsid() system call will be made in thechild process prior to the execution of the subprocess. (POSIX only)
Changed in version 3.2:start_new_session was added.
Ifenv is not
None, it must be a mapping that defines the environmentvariables for the new process; these are used instead of the defaultbehavior of inheriting the current process’ environment.Note
If specified,env must provide any variables required for the program toexecute. On Windows, in order to run aside-by-side assembly thespecifiedenvmust include a valid
SystemRoot.Ifuniversal_newlines is
True, the file objectsstdin,stdoutandstderr are opened as text streams in universal newlines mode, asdescribed above inFrequently Used Arguments, otherwise they areopened as binary streams.If given,startupinfo will be a
STARTUPINFOobject, which ispassed to the underlyingCreateProcessfunction.creationflags, if given, can beCREATE_NEW_CONSOLEorCREATE_NEW_PROCESS_GROUP. (Windows only)Popen objects are supported as context managers via the
withstatement:on exit, standard file descriptors are closed, and the process is waited for.withPopen(["ifconfig"],stdout=PIPE)asproc:log.write(proc.stdout.read())
Changed in version 3.2:Added context manager support.
17.5.1.3. Exceptions¶
Exceptions raised in the child process, before the new program has started toexecute, will be re-raised in the parent. Additionally, the exception objectwill have one extra attribute calledchild_traceback, which is a stringcontaining traceback information from the child’s point of view.
The most common exception raised isOSError. This occurs, for example,when trying to execute a non-existent file. Applications should prepare forOSError exceptions.
AValueError will be raised ifPopen is called with invalidarguments.
check_call() andcheck_output() will raiseCalledProcessError if the called process returns a non-zero returncode.
All of the functions and methods that accept atimeout parameter, such ascall() andPopen.communicate() will raiseTimeoutExpired ifthe timeout expires before the process exits.
Exceptions defined in this module all inherit fromSubprocessError.
New in version 3.3:The
SubprocessErrorbase class was added.
17.5.2. Security Considerations¶
Unlike some other popen functions, this implementation will neverimplicitly call a system shell. This means that all characters,including shell metacharacters, can safely be passed to child processes.If the shell is invoked explicitly, viashell=True, it is the application’sresponsibility to ensure that all whitespace and metacharacters arequoted appropriately to avoidshell injectionvulnerabilities.
When usingshell=True, theshlex.quote() function can beused to properly escape whitespace and shell metacharacters in stringsthat are going to be used to construct shell commands.
17.5.3. Popen Objects¶
Instances of thePopen class have the following methods:
Popen.poll()¶Check if child process has terminated. Set and return
returncodeattribute.
Popen.wait(timeout=None)¶Wait for child process to terminate. Set and return
returncodeattribute.If the process does not terminate aftertimeout seconds, raise a
TimeoutExpiredexception. It is safe to catch this exception andretry the wait.Note
This will deadlock when using
stdout=PIPEorstderr=PIPEand the child process generates enough output to a pipe such thatit blocks waiting for the OS pipe buffer to accept more data.UsePopen.communicate()when using pipes to avoid that.Note
The function is implemented using a busy loop (non-blocking call andshort sleeps). Use the
asynciomodule for an asynchronous wait:seeasyncio.create_subprocess_exec.Changed in version 3.3:timeout was added.
Deprecated since version 3.4:Do not use theendtime parameter. It is was unintentionallyexposed in 3.3 but was left undocumented as it was intended to beprivate for internal use. Usetimeout instead.
Popen.communicate(input=None,timeout=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 optionalinput argument should be data to be sent to the child process, or
None, if no data should be sent to the child. The type ofinputmust be bytes or, ifuniversal_newlines wasTrue, a string.communicate()returns a tuple(stdout_data,stderr_data).The data will be bytes or, ifuniversal_newlines wasTrue, strings.Note that if you want to send data to the process’s stdin, you need to createthe Popen object with
stdin=PIPE. Similarly, to get anything other thanNonein the result tuple, you need to givestdout=PIPEand/orstderr=PIPEtoo.If the process does not terminate aftertimeout seconds, a
TimeoutExpiredexception will be raised. Catching this exception andretrying communication will not lose any output.The child process is not killed if the timeout expires, so in order tocleanup properly a well-behaved application should kill the child process andfinish communication:
proc=subprocess.Popen(...)try:outs,errs=proc.communicate(timeout=15)exceptTimeoutExpired:proc.kill()outs,errs=proc.communicate()
Note
The data read is buffered in memory, so do not use this method if the datasize is large or unlimited.
Changed in version 3.3:timeout was added.
Popen.send_signal(signal)¶Sends the signalsignal to the child.
Note
On Windows, SIGTERM is an alias for
terminate(). CTRL_C_EVENT andCTRL_BREAK_EVENT can be sent to processes started with acreationflagsparameter which includesCREATE_NEW_PROCESS_GROUP.
Popen.terminate()¶Stop the child. On Posix OSs the method sends SIGTERM to thechild. On Windows the Win32 API function
TerminateProcess()is calledto stop the child.
Popen.kill()¶Kills the child. On Posix OSs the function sends SIGKILL to the child.On Windows
kill()is an alias forterminate().
The following attributes are also available:
Popen.args¶Theargs argument as it was passed to
Popen– asequence of program arguments or else a single string.New in version 3.3.
Popen.stdin¶If thestdin argument was
PIPE, this attribute is a writeablestream object as returned byopen(). If theuniversal_newlinesargument wasTrue, the stream is a text stream, otherwise it is a bytestream. If thestdin argument was notPIPE, this attribute isNone.
Popen.stdout¶If thestdout argument was
PIPE, this attribute is a readablestream object as returned byopen(). Reading from the stream providesoutput from the child process. If theuniversal_newlines argument wasTrue, the stream is a text stream, otherwise it is a byte stream. If thestdout argument was notPIPE, this attribute isNone.
Popen.stderr¶If thestderr argument was
PIPE, this attribute is a readablestream object as returned byopen(). Reading from the stream provideserror output from the child process. If theuniversal_newlines argument wasTrue, the stream is a text stream, otherwise it is a byte stream. If thestderr argument was notPIPE, this attribute isNone.
Warning
Usecommunicate() rather than.stdin.write,.stdout.read or.stderr.read to avoiddeadlocks due to any of the other OS pipe buffers filling up and blocking thechild process.
Popen.pid¶The process ID of the child process.
Note that if you set theshell argument to
True, this is the process IDof the spawned shell.
Popen.returncode¶The child return code, set by
poll()andwait()(and indirectlybycommunicate()). ANonevalue indicates that the processhasn’t terminated yet.A negative value
-Nindicates that the child was terminated by signalN(POSIX only).
17.5.4. Windows Popen Helpers¶
TheSTARTUPINFO class and following constants are only availableon Windows.
- class
subprocess.STARTUPINFO¶ Partial support of the WindowsSTARTUPINFOstructure is used for
Popencreation.dwFlags¶A bit field that determines whether certain
STARTUPINFOattributes are used when the process creates a window.si=subprocess.STARTUPINFO()si.dwFlags=subprocess.STARTF_USESTDHANDLES|subprocess.STARTF_USESHOWWINDOW
hStdInput¶If
dwFlagsspecifiesSTARTF_USESTDHANDLES, this attributeis the standard input handle for the process. IfSTARTF_USESTDHANDLESis not specified, the default for standardinput is the keyboard buffer.
hStdOutput¶If
dwFlagsspecifiesSTARTF_USESTDHANDLES, this attributeis the standard output handle for the process. Otherwise, this attributeis ignored and the default for standard output is the console window’sbuffer.
hStdError¶If
dwFlagsspecifiesSTARTF_USESTDHANDLES, this attributeis the standard error handle for the process. Otherwise, this attribute isignored and the default for standard error is the console window’s buffer.
wShowWindow¶If
dwFlagsspecifiesSTARTF_USESHOWWINDOW, this attributecan be any of the values that can be specified in thenCmdShowparameter for theShowWindowfunction, except forSW_SHOWDEFAULT. Otherwise, this attribute isignored.SW_HIDEis provided for this attribute. It is used whenPopenis called withshell=True.
17.5.4.1. Constants¶
Thesubprocess module exposes the following constants.
subprocess.STD_INPUT_HANDLE¶The standard input device. Initially, this is the console input buffer,
CONIN$.
subprocess.STD_OUTPUT_HANDLE¶The standard output device. Initially, this is the active console screenbuffer,
CONOUT$.
subprocess.STD_ERROR_HANDLE¶The standard error device. Initially, this is the active console screenbuffer,
CONOUT$.
subprocess.SW_HIDE¶Hides the window. Another window will be activated.
subprocess.STARTF_USESTDHANDLES¶Specifies that the
STARTUPINFO.hStdInput,STARTUPINFO.hStdOutput, andSTARTUPINFO.hStdErrorattributescontain additional information.
subprocess.STARTF_USESHOWWINDOW¶Specifies that the
STARTUPINFO.wShowWindowattribute containsadditional information.
subprocess.CREATE_NEW_CONSOLE¶The new process has a new console, instead of inheriting its parent’sconsole (the default).
subprocess.CREATE_NEW_PROCESS_GROUP¶A
Popencreationflagsparameter to specify that a new processgroup will be created. This flag is necessary for usingos.kill()on the subprocess.This flag is ignored if
CREATE_NEW_CONSOLEis specified.
17.5.5. Older high-level API¶
Prior to Python 3.5, these three functions comprised the high level API tosubprocess. You can now userun() in many cases, but lots of existing codecalls these functions.
subprocess.call(args,*,stdin=None,stdout=None,stderr=None,shell=False,timeout=None)¶Run the command described byargs. Wait for command to complete, thenreturn the
returncodeattribute.This is equivalent to:
run(...).returncode
(except that theinput andcheck parameters are not supported)
The arguments shown above are merely the mostcommon ones. The full function signature is largely thesame as that of the
Popenconstructor - this function passes allsupplied arguments other thantimeout directly through to that interface.Note
Do not use
stdout=PIPEorstderr=PIPEwith thisfunction. The child process will block if it generates enoughoutput to a pipe to fill up the OS pipe buffer as the pipes arenot being read from.Changed in version 3.3:timeout was added.
subprocess.check_call(args,*,stdin=None,stdout=None,stderr=None,shell=False,timeout=None)¶Run command with arguments. Wait for command to complete. If the returncode was zero then return, otherwise raise
CalledProcessError. TheCalledProcessErrorobject will have the return code in thereturncodeattribute.This is equivalent to:
run(...,check=True)
(except that theinput parameter is not supported)
The arguments shown above are merely the mostcommon ones. The full function signature is largely thesame as that of the
Popenconstructor - this function passes allsupplied arguments other thantimeout directly through to that interface.Note
Do not use
stdout=PIPEorstderr=PIPEwith thisfunction. The child process will block if it generates enoughoutput to a pipe to fill up the OS pipe buffer as the pipes arenot being read from.Changed in version 3.3:timeout was added.
subprocess.check_output(args,*,stdin=None,stderr=None,shell=False,universal_newlines=False,timeout=None)¶Run command with arguments and return its output.
If the return code was non-zero it raises a
CalledProcessError. TheCalledProcessErrorobject will have the return code in thereturncodeattribute and any output in theoutputattribute.This is equivalent to:
run(...,check=True,stdout=PIPE).stdout
The arguments shown above are merely the most common ones.The full function signature is largely the same as that of
run()-most arguments are passed directly through to that interface.However, explicitly passinginput=Noneto inherit the parent’sstandard input file handle is not supported.By default, this function will return the data as encoded bytes. The actualencoding of the output data may depend on the command being invoked, so thedecoding to text will often need to be handled at the application level.
This behaviour may be overridden by settinguniversal_newlines to
Trueas described above inFrequently Used Arguments.To also capture standard error in the result, use
stderr=subprocess.STDOUT:>>>subprocess.check_output(..."ls non_existent_file; exit 0",...stderr=subprocess.STDOUT,...shell=True)'ls: non_existent_file: No such file or directory\n'
New in version 3.1.
Changed in version 3.3:timeout was added.
Changed in version 3.4:Support for theinput keyword argument was added.
17.5.6. Replacing Older Functions with thesubprocess Module¶
In this section, “a becomes b” means that b can be used as a replacement for a.
Note
All “a” functions in this section fail (more or less) silently if theexecuted program cannot be found; the “b” replacements raiseOSErrorinstead.
In addition, the replacements usingcheck_output() will fail with aCalledProcessError if the requested operation produces a non-zeroreturn code. The output is still available as theoutput attribute of the raised exception.
In the following examples, we assume that the relevant functions have alreadybeen imported from thesubprocess module.
17.5.6.1. Replacing /bin/sh shell backquote¶
output=`mycmdmyarg`
becomes:
output=check_output(["mycmd","myarg"])
17.5.6.2. Replacing shell pipeline¶
output=`dmesg|grephda`
becomes:
p1=Popen(["dmesg"],stdout=PIPE)p2=Popen(["grep","hda"],stdin=p1.stdout,stdout=PIPE)p1.stdout.close()# Allow p1 to receive a SIGPIPE if p2 exits.output=p2.communicate()[0]
The p1.stdout.close() call after starting the p2 is important in order for p1to receive a SIGPIPE if p2 exits before p1.
Alternatively, for trusted input, the shell’s own pipeline support may stillbe used directly:
output=`dmesg|grephda`
becomes:
output=check_output("dmesg | grep hda",shell=True)
17.5.6.3. Replacingos.system()¶
sts=os.system("mycmd"+" myarg")# becomessts=call("mycmd"+" myarg",shell=True)
Notes:
- Calling the program through the shell is usually not required.
A more realistic example would look like this:
try:retcode=call("mycmd"+" myarg",shell=True)ifretcode<0:print("Child was terminated by signal",-retcode,file=sys.stderr)else:print("Child returned",retcode,file=sys.stderr)exceptOSErrorase:print("Execution failed:",e,file=sys.stderr)
17.5.6.4. Replacing theos.spawn family¶
P_NOWAIT example:
pid=os.spawnlp(os.P_NOWAIT,"/bin/mycmd","mycmd","myarg")==>pid=Popen(["/bin/mycmd","myarg"]).pid
P_WAIT example:
retcode=os.spawnlp(os.P_WAIT,"/bin/mycmd","mycmd","myarg")==>retcode=call(["/bin/mycmd","myarg"])
Vector example:
os.spawnvp(os.P_NOWAIT,path,args)==>Popen([path]+args[1:])
Environment example:
os.spawnlpe(os.P_NOWAIT,"/bin/mycmd","mycmd","myarg",env)==>Popen(["/bin/mycmd","myarg"],env={"PATH":"/usr/bin"})
17.5.6.5. Replacingos.popen(),os.popen2(),os.popen3()¶
(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)
(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)
(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)
Return code handling translates as follows:
pipe=os.popen(cmd,'w')...rc=pipe.close()ifrcisnotNoneandrc>>8:print("There were some errors")==>process=Popen(cmd,stdin=PIPE)...process.stdin.close()ifprocess.wait()!=0:print("There were some errors")
17.5.6.6. Replacing functions from thepopen2 module¶
Note
If the cmd argument to popen2 functions is a string, the command is executedthrough /bin/sh. If it is a list, the command is directly executed.
(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)
(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)
popen2.Popen3 andpopen2.Popen4 basically work assubprocess.Popen, except that:
Popenraises an exception if the execution fails.- thecapturestderr argument is replaced with thestderr argument.
stdin=PIPEandstdout=PIPEmust be specified.- popen2 closes all file descriptors by default, but you have to specify
close_fds=TruewithPopento guarantee this behavior onall platforms or past Python versions.
17.5.7. Legacy Shell Invocation Functions¶
This module also provides the following legacy functions from the 2.xcommands module. These operations implicitly invoke the system shell andnone of the guarantees described above regarding security and exceptionhandling consistency are valid for these functions.
subprocess.getstatusoutput(cmd)¶Return
(status,output)of executingcmd in a shell.Execute the stringcmd in a shell with
Popen.check_output()andreturn a 2-tuple(status,output). Universal newlines mode is used;see the notes onFrequently Used Arguments for more details.A trailing newline is stripped from the output.The exit status for the command can be interpretedaccording to the rules for the C function
wait(). Example:>>>subprocess.getstatusoutput('ls /bin/ls')(0, '/bin/ls')>>>subprocess.getstatusoutput('cat /bin/junk')(256, 'cat: /bin/junk: No such file or directory')>>>subprocess.getstatusoutput('/bin/junk')(256, 'sh: /bin/junk: not found')
Availability: POSIX & Windows
Changed in version 3.3.4:Windows support added
subprocess.getoutput(cmd)¶Return output (stdout and stderr) of executingcmd in a shell.
Like
getstatusoutput(), except the exit status is ignored and the returnvalue is a string containing the command’s output. Example:>>>subprocess.getoutput('ls /bin/ls')'/bin/ls'
Availability: POSIX & Windows
Changed in version 3.3.4:Windows support added
17.5.8. Notes¶
17.5.8.1. Converting an argument sequence to a string on Windows¶
On Windows, anargs sequence is converted to a string that can be parsedusing the following rules (which correspond to the rules used by the MS Cruntime):
- Arguments are delimited by white space, which is either aspace or a tab.
- A string surrounded by double quotation marks isinterpreted as a single argument, regardless of white spacecontained within. A quoted string can be embedded in anargument.
- A double quotation mark preceded by a backslash isinterpreted as a literal double quotation mark.
- Backslashes are interpreted literally, unless theyimmediately precede a double quotation mark.
- If backslashes immediately precede a double quotation mark,every pair of backslashes is interpreted as a literalbackslash. If the number of backslashes is odd, the lastbackslash escapes the next double quotation mark asdescribed in rule 3.
See also
shlex- Module which provides function to parse and escape command lines.
