1246 lines · 42.6 KB · Python
RawDownload
# subprocess - Subprocesses with accessible I/O streams## For more information about this module, see PEP 324.## This module should remain compatible with Python 2.2, see PEP 291.## Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se>## 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 This module allows you to spawn processes, connect to theirinput/output/error pipes, and obtain their return codes.  This moduleintends to replace several other, older modules and functions, like: os.systemos.spawn*os.popen*popen2.*commands.* Information about how the subprocess module can be used to replace thesemodules and functions can be found below.   Using the subprocess module===========================This module defines one class called Popen: 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):  Arguments are: 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 shell=False (default): In this case, the Popen classuses os.execvp() to execute the child program.  args should normallybe a sequence.  A string will be treated as a sequence with the stringas the only item (the program to execute). On UNIX, with shell=True: If args is a string, it specifies thecommand string to execute through the shell.  If args is a sequence,the first item specifies the command string, and any additional itemswill be treated as additional shell arguments. On Windows: the Popen class uses CreateProcess() to execute the childprogram, which operates on strings.  If args is a sequence, it will beconverted to a string using the list2cmdline method.  Please note thatnot all MS Windows applications interpret the command line the sameway: The list2cmdline is designed for applications using the samerules as the MS C runtime. bufsize, if given, has the same meaning as the corresponding argumentto the built-in open() function: 0 means unbuffered, 1 means linebuffered, any other positive value means use a buffer of(approximately) that size.  A negative bufsize means to use the systemdefault, which usually means fully buffered.  The default value forbufsize is 0 (unbuffered). stdin, stdout and stderr specify the executed programs' standardinput, standard output and standard error file handles, respectively.Valid values are PIPE, an existing file descriptor (a positiveinteger), an existing file object, and None.  PIPE indicates that anew pipe to the child should be created.  With None, no redirectionwill occur; the child's file handles will be inherited from theparent.  Additionally, stderr can be STDOUT, which indicates that thestderr data from the applications should be captured into the samefile handle as for stdout. If preexec_fn is set to a callable object, this object will be calledin the child process just before the child is executed. If close_fds is true, all file descriptors except 0, 1 and 2 will beclosed before the child process is executed. if shell is true, the specified command will be executed through theshell. If cwd is not None, the current directory will be changed to cwdbefore the child is executed. If env is not None, it defines the environment variables for the newprocess. If universal_newlines is true, the file objects stdout and stderr areopened as a text files, but lines may be terminated by any of '\n',the Unix end-of-line convention, '\r', the Macintosh convention or'\r\n', the Windows convention.  All of these external representationsare seen as '\n' by the Python program.  Note: This feature is onlyavailable if Python is built with universal newline support (thedefault).  Also, the newlines attribute of the file objects stdout,stdin and stderr are not updated by the communicate() method. The startupinfo and creationflags, if given, will be passed to theunderlying CreateProcess() function.  They can specify things such asappearance of the main window and priority for the new process.(Windows only)  This module also defines two shortcut functions: call(*popenargs, **kwargs):    Run command with arguments.  Wait for command to complete, then    return the returncode attribute.     The arguments are the same as for the Popen constructor.  Example:     retcode = call(["ls", "-l"]) 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.     The arguments are the same as for the Popen constructor.  Example:     check_call(["ls", "-l"]) 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'child_traceback', which is a string containing traceback informationfrom the childs point of view. The most common exception raised is OSError.  This occurs, forexample, when trying to execute a non-existent file.  Applicationsshould prepare for OSErrors. A ValueError will be raised if Popen is called with invalid arguments. check_call() will raise CalledProcessError, if the called processreturns a non-zero return code.  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.  Popen objects=============Instances of the Popen class have the following methods: poll()    Check if child process has terminated.  Returns returncode    attribute. wait()    Wait for child process to terminate.  Returns returncode attribute. 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 input argument should be a string to be    sent to the child process, or 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. 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. stdout    If the stdout argument is PIPE, this attribute is a file object    that provides output from the child process.  Otherwise, it is    None. stderr    If the stderr argument is PIPE, this attribute is file object that    provides error output from the child process.  Otherwise, it is    None. pid    The process ID of the child process. returncode    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 (UNIX only).  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 OSErrorexception. In the following examples, we assume that the subprocess module isimported 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 >>sys.stderr, "Child was terminated by signal", -retcode    else:        print >>sys.stderr, "Child returned", retcodeexcept OSError, e:    print >>sys.stderr, "Execution failed:", e  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"})  Replacing os.popen*-------------------pipe = os.popen(cmd, mode='r', bufsize)==>pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout pipe = os.popen(cmd, mode='w', bufsize)==>pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin  (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)  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. (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) The popen2.Popen3 and popen3.Popen4 basically works as subprocess.Popen,except that: * subprocess.Popen raises an exception if the execution fails* the capturestderr argument is replaced with the stderr argument.* stdin=PIPE and stdout=PIPE must be specified.* popen2 closes all filedescriptors by default, but you have to specify  close_fds=True with subprocess.Popen.  """ import sysmswindows = (sys.platform == "win32") import osimport typesimport traceback # Exception classes used by this module.class CalledProcessError(Exception):    """This exception is raised when a process run by check_call() returns    a non-zero exit status.  The exit status will be stored in the    returncode attribute."""    def __init__(self, returncode, cmd):        self.returncode = returncode        self.cmd = cmd    def __str__(self):        return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)  if mswindows:    import threading    import msvcrt    if 0: # <-- change this to use pywin32 instead of the _subprocess driver        import pywintypes        from win32api import GetStdHandle, STD_INPUT_HANDLE, \                             STD_OUTPUT_HANDLE, STD_ERROR_HANDLE        from win32api import GetCurrentProcess, DuplicateHandle, \                             GetModuleFileName, GetVersion        from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE        from win32pipe import CreatePipe        from win32process import CreateProcess, STARTUPINFO, \                                 GetExitCodeProcess, STARTF_USESTDHANDLES, \                                 STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE        from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0    else:        from _subprocess import *        class STARTUPINFO:            dwFlags = 0            hStdInput = None            hStdOutput = None            hStdError = None            wShowWindow = 0        class pywintypes:            error = IOErrorelse:    import select    import errno    import fcntl    import pickle __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "CalledProcessError"] try:    MAXFD = os.sysconf("SC_OPEN_MAX")except:    MAXFD = 256 # True/False does not exist on 2.2.0try:    Falseexcept NameError:    False = 0    True = 1 _active = [] def _cleanup():    for inst in _active[:]:        if inst.poll(_deadstate=sys.maxint) >= 0:            try:                _active.remove(inst)            except ValueError:                # This can happen if two threads create a new Popen instance.                # It's harmless that it was already removed, so ignore.                pass PIPE = -1STDOUT = -2  def call(*popenargs, **kwargs):    """Run command with arguments.  Wait for command to complete, then    return the returncode attribute.     The arguments are the same as for the Popen constructor.  Example:     retcode = call(["ls", "-l"])    """    return Popen(*popenargs, **kwargs).wait()  def 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.     The arguments are the same as for the Popen constructor.  Example:     check_call(["ls", "-l"])    """    retcode = call(*popenargs, **kwargs)    cmd = kwargs.get("args")    if cmd is None:        cmd = popenargs[0]    if retcode:        raise CalledProcessError(retcode, cmd)    return retcode  def list2cmdline(seq):    """    Translate a sequence of arguments into a command line    string, using the same rules as the MS C runtime:     1) Arguments are delimited by white space, which is either a       space or a tab.     2) A string surrounded by double quotation marks is       interpreted as a single argument, regardless of white space       contained within.  A quoted string can be embedded in an       argument.     3) A double quotation mark preceded by a backslash is       interpreted as a literal double quotation mark.     4) Backslashes are interpreted literally, unless they       immediately precede a double quotation mark.     5) If backslashes immediately precede a double quotation mark,       every pair of backslashes is interpreted as a literal       backslash.  If the number of backslashes is odd, the last       backslash escapes the next double quotation mark as       described in rule 3.    """     # See    # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp    result = []    needquote = False    for arg in seq:        bs_buf = []         # Add a space to separate this argument from the others        if result:            result.append(' ')

Lines 1–500 of 1246.