cpython: 720865fa61a4 (original) (raw)
--- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -7,352 +7,38 @@
Licensed to PSF under a Contributor Agreement.
See http://www.python.org/2.4/license for licensing details.
-r"""subprocess - Subprocesses with accessible I/O streams +r"""Subprocesses with accessible I/O streams This module allows you to spawn processes, connect to their -input/output/error pipes, and obtain their return codes. This module -intends to replace several older modules and functions: - -os.system -os.spawn* - -Information about how the subprocess module can be used to replace these -modules and functions can be found below. - - - -Using the subprocess module -=========================== -This module defines one class called Popen: - -class Popen(args, bufsize=-1, executable=None,
stdin=None, stdout=None, stderr=None,[](#l1.27)
preexec_fn=None, close_fds=True, shell=False,[](#l1.28)
cwd=None, env=None, universal_newlines=False,[](#l1.29)
startupinfo=None, creationflags=0,[](#l1.30)
restore_signals=True, start_new_session=False, pass_fds=()):[](#l1.31)
- - -Arguments are: +input/output/error pipes, and obtain their return codes. -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 POSIX, with shell=False (default): In this case, the Popen class -uses os.execvp() to execute the child program. 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 POSIX, with shell=True: If args is a string, it specifies the -command string to execute through the shell. If 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 Popen class uses CreateProcess() to execute the child -program, which operates on strings. If args is a sequence, it will be -converted to a string using the list2cmdline method. Please note that -not all MS Windows applications interpret the command line the same -way: The list2cmdline is designed for applications using the same -rules as the MS C runtime. - -bufsize will be supplied as the corresponding argument to the io.open() -function when creating the stdin/stdout/stderr pipe file objects: -0 means unbuffered (read & write are one system call and can return short), -1 means line buffered, any other positive value means use a buffer of -approximately that size. A negative bufsize, the default, means the system -default of io.DEFAULT_BUFFER_SIZE will be used. +For a complete description of this module see the Python documentation. -stdin, stdout and stderr specify the executed programs' standard -input, standard output and standard error file handles, respectively. -Valid values are PIPE, an existing file descriptor (a positive -integer), an existing file object, and None. PIPE indicates that a -new pipe to the child should be created. With None, no redirection -will occur; the child's file handles will be inherited from the -parent. Additionally, stderr can be STDOUT, which indicates that the -stderr data from the applications should be captured into the same -file handle as for stdout. - -On POSIX, if preexec_fn is set to a callable object, this object will be -called in the child process just before the child is executed. The use -of preexec_fn is not thread safe, using it in the presence of threads -could lead to a deadlock in the child process before the new executable -is executed. - -If close_fds is true, all file descriptors except 0, 1 and 2 will be -closed before the child process is executed. The default for close_fds -varies by platform: Always true on POSIX. True when stdin/stdout/stderr -are None on Windows, false otherwise. - -pass_fds is an optional sequence of file descriptors to keep open between the -parent and child. Providing any pass_fds implicitly sets close_fds to true. - -if shell is true, the specified command will be executed through the -shell. - -If cwd is not None, the current directory will be changed to cwd -before the child is executed. +Main API +======== +run(...): Runs a command, waits for it to complete, then returns a
CompletedProcess instance.[](#l1.98)
+Popen(...): A class for flexibly executing a command in a new process -On POSIX, if restore_signals is True all signals that Python sets to -SIG_IGN are restored to SIG_DFL in the child process before the exec. -Currently this includes the SIGPIPE, SIGXFZ and SIGXFSZ signals. This -parameter does nothing on Windows. - -On POSIX, if start_new_session is True, the setsid() system call will be made -in the child process prior to executing the command. - -If env is not None, it defines the environment variables for the new -process. - -If universal_newlines is False, the file objects stdin, stdout and stderr -are opened as binary files, and no line ending conversion is done. - -If universal_newlines is True, the file objects stdout and stderr are -opened as a text file, but lines may be terminated by any of '\n', -the Unix end-of-line convention, '\r', the old Macintosh convention or -'\r\n', the Windows convention. All of these external representations -are seen as '\n' by the Python program. Also, the newlines attribute -of the file objects stdout, stdin and stderr are not updated by the -communicate() method. - -In either case, the process being communicated with should start up -expecting to receive bytes on its standard input and decode them with -the same encoding they are sent in. - -The startupinfo and 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) +Constants +--------- +DEVNULL: Special value that indicates that os.devnull should be used +PIPE: Special value that indicates a pipe should be created +STDOUT: Special value that indicates that stderr should go to stdout -This module also defines some shortcut functions: - -call(*popenargs, **kwargs):
- -check_call(*popenargs, **kwargs):
- Run command with arguments. Wait for command to complete. If the
- exit code was zero then return, otherwise raise
- CalledProcessError. The CalledProcessError object will have the
- return code in the returncode attribute.
- Execute the string 'cmd' in a shell with 'check_output' and
- return a 2-tuple (status, output). Universal newlines mode is used,
- meaning that the result with be decoded to a string.
- A trailing newline is stripped from the output.
- The exit status for the command can be interpreted
- according to the rules for the function 'wait'. Example:
- Like getstatusoutput(), except the exit status is ignored and the return
- value is a string containing the command's output. Example:
- -check_output(*popenargs, **kwargs):
- If the exit code was non-zero it raises a CalledProcessError. The
- CalledProcessError object will have the return code in the returncode
- attribute and output in the output attribute.
- There is an additional optional argument, "input", allowing you to
- pass a string to the subprocess's stdin. If you use this argument
- you may not also use the Popen constructor's "stdin" argument.
- If universal_newlines is set to True, the "input" argument must
- be a string rather than bytes, and the return value will be a string.
- -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 -'child_traceback', which is a string containing traceback information -from the child's point of view. - -The most common exception raised is OSError. This occurs, for -example, when trying to execute a non-existent file. Applications -should prepare for OSErrors. - -A ValueError will be raised if Popen is called with invalid arguments. - -Exceptions defined within this module inherit from SubprocessError. -check_call() and check_output() will raise CalledProcessError if the -called process returns a non-zero return code. TimeoutExpired -be raised if a timeout was specified and expired. - - -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. - - -Popen objects -============= -Instances of the Popen class have the following methods: - -poll()
- 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 input argument should be data to be
- sent to the child process, or None, if no data should be sent to
- the child. If the Popen instance was constructed with universal_newlines
- set to True, the input argument should be a string and will be encoded
- using the preferred system encoding (see locale.getpreferredencoding);
- if universal_newlines is False, the input argument should be a
- byte string.
- Note: The data read is buffered in memory, so do not use this
- method if the data size is large or unlimited.
- -The following attributes are also available: - -stdin
- If the stdin argument is PIPE, this attribute is a file object
- that provides input to the child process. Otherwise, it is None.
- If the stdout argument is PIPE, this attribute is a file object
- that provides output from the child process. Otherwise, it is
- None.
- If the stderr argument is PIPE, this attribute is file object that
- provides error output from the child process. Otherwise, it is
- None.
- The child return code. A None value indicates that the process
- hasn't terminated yet. A negative value -N indicates that the
- child was terminated by signal N (POSIX only).
-
-
-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 OSError
-exception.
-
-In the following examples, we assume that the subprocess module is
-imported with "from subprocess import ".
-
-
-Replacing /bin/sh shell backquote
----------------------------------
-output=mycmd myarg
-==>
-output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
-
-
-Replacing shell pipe line
--------------------------
-output=dmesg | grep hda
-==>
-p1 = Popen(["dmesg"], stdout=PIPE)
-p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
-output = p2.communicate()[0]
-
-
-Replacing os.system()
----------------------
-sts = os.system("mycmd" + " myarg")
-==>
-p = Popen("mycmd" + " myarg", shell=True)
-pid, sts = os.waitpid(p.pid, 0)
-
-Note:
-
- Calling the program through the shell is usually not required.
-
-* It's easier to look at the returncode attribute than the
- exitstatus. - -A more real-world example would look like this: - -try:
- retcode = call("mycmd" + " myarg", shell=True)
- if retcode < 0:
print("Child was terminated by signal", -retcode, file=sys.stderr)[](#l1.331)
- else:
print("Child returned", retcode, file=sys.stderr)[](#l1.333)
- - -Replacing os.spawn* -------------------- -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"}) +Older API +========= +call(...): Runs a command, waits for it to complete, then returns
+check_call(...): Same as call() but raises CalledProcessError()
+check_output(...): Same as check_call() but returns the contents of
+getoutput(...): Runs a command in the shell, waits for it to complete,
+getstatusoutput(...): Runs a command in the shell, waits for it to complete,
""" import sys @@ -372,10 +58,11 @@ class SubprocessError(Exception): pass class CalledProcessError(SubprocessError):
- """This exception is raised when a process run by check_call() or
- check_output() returns a non-zero exit status.
- The exit status will be stored in the returncode attribute;
- check_output() will also store the output in the output attribute.
- Attributes:
""" def init(self, returncode, cmd, output=None, stderr=None): self.returncode = returncodecmd, returncode, stdout, stderr, output[](#l1.393)
@@ -401,6 +88,9 @@ class CalledProcessError(SubprocessError class TimeoutExpired(SubprocessError): """This exception is raised when the timeout expires while waiting for a child process. +
- Attributes:
""" def init(self, cmd, timeout, output=None, stderr=None): self.cmd = cmdcmd, output, stdout, stderr, timeout[](#l1.403)
@@ -828,7 +518,46 @@ def getoutput(cmd): class Popen(object):
bufsize: supplied as the buffering argument to the open() function when[](#l1.418)
creating the stdin/stdout/stderr pipe file objects[](#l1.419)
executable: A replacement program to execute.[](#l1.421)
stdin, stdout and stderr: These specify the executed programs' standard[](#l1.423)
input, standard output and standard error file handles, respectively.[](#l1.424)
preexec_fn: (POSIX only) An object to be called in the child process[](#l1.426)
just before the child is executed.[](#l1.427)
close_fds: Controls closing or inheriting of file descriptors.[](#l1.429)
shell: If true, the command will be executed through the shell.[](#l1.431)
cwd: Sets the current directory before the child is executed.[](#l1.433)
env: Defines the environment variables for the new process.[](#l1.435)
universal_newlines: If true, use universal line endings for file[](#l1.437)
objects stdin, stdout and stderr.[](#l1.438)
startupinfo and creationflags (Windows only)[](#l1.440)
restore_signals (POSIX only)[](#l1.442)
start_new_session (POSIX only)[](#l1.444)
pass_fds (POSIX only)[](#l1.446)
- Attributes:
stdin, stdout, stderr, pid, returncode[](#l1.449)
- """ _child_created = False # Set here since del checks it def init(self, args, bufsize=-1, executable=None, @@ -1079,6 +808,8 @@ class Popen(object): def poll(self):
"""Check if child process has terminated. Set and return returncode[](#l1.458)
attribute."""[](#l1.459) return self._internal_poll()[](#l1.460)
--- a/Misc/ACKS +++ b/Misc/ACKS @@ -999,6 +999,7 @@ Julien Miotte Andrii V. Mishkovskyi Dom Mitchell Dustin J. Mitchell +Tim Mitchell Zubin Mithra Florian Mladitsch Doug Moen