| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1 | # subprocess - Subprocesses with accessible I/O streams | 
 | 2 | # | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 3 | # For more information about this module, see PEP 324. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 4 | # | 
| Peter Astrand | 3a708df | 2005-09-23 17:37:29 +0000 | [diff] [blame] | 5 | # Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se> | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 6 | # | 
| Peter Astrand | 69bf13f | 2005-02-14 08:56:32 +0000 | [diff] [blame] | 7 | # Licensed to PSF under a Contributor Agreement. | 
| Peter Astrand | 3a708df | 2005-09-23 17:37:29 +0000 | [diff] [blame] | 8 | # See http://www.python.org/2.4/license for licensing details. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 9 |  | 
| Raymond Hettinger | 837dd93 | 2004-10-17 16:36:53 +0000 | [diff] [blame] | 10 | r"""subprocess - Subprocesses with accessible I/O streams | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 11 |  | 
| Fredrik Lundh | 15aaacc | 2004-10-17 14:47:05 +0000 | [diff] [blame] | 12 | This module allows you to spawn processes, connect to their | 
 | 13 | input/output/error pipes, and obtain their return codes.  This module | 
 | 14 | intends to replace several other, older modules and functions, like: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 15 |  | 
 | 16 | os.system | 
 | 17 | os.spawn* | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 18 |  | 
 | 19 | Information about how the subprocess module can be used to replace these | 
 | 20 | modules and functions can be found below. | 
 | 21 |  | 
 | 22 |  | 
 | 23 |  | 
 | 24 | Using the subprocess module | 
 | 25 | =========================== | 
 | 26 | This module defines one class called Popen: | 
 | 27 |  | 
| Gregory P. Smith | a1ed539 | 2013-03-23 11:44:25 -0700 | [diff] [blame] | 28 | class Popen(args, bufsize=-1, executable=None, | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 29 |             stdin=None, stdout=None, stderr=None, | 
| Gregory P. Smith | 8edd99d | 2010-12-14 13:43:30 +0000 | [diff] [blame] | 30 |             preexec_fn=None, close_fds=True, shell=False, | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 31 |             cwd=None, env=None, universal_newlines=False, | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 32 |             startupinfo=None, creationflags=0, | 
| Gregory P. Smith | 8edd99d | 2010-12-14 13:43:30 +0000 | [diff] [blame] | 33 |             restore_signals=True, start_new_session=False, pass_fds=()): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 34 |  | 
 | 35 |  | 
 | 36 | Arguments are: | 
 | 37 |  | 
 | 38 | args should be a string, or a sequence of program arguments.  The | 
 | 39 | program to execute is normally the first item in the args sequence or | 
 | 40 | string, but can be explicitly set by using the executable argument. | 
 | 41 |  | 
| Gregory P. Smith | f560485 | 2010-12-13 06:45:02 +0000 | [diff] [blame] | 42 | On POSIX, with shell=False (default): In this case, the Popen class | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 43 | uses os.execvp() to execute the child program.  args should normally | 
 | 44 | be a sequence.  A string will be treated as a sequence with the string | 
 | 45 | as the only item (the program to execute). | 
 | 46 |  | 
| Gregory P. Smith | f560485 | 2010-12-13 06:45:02 +0000 | [diff] [blame] | 47 | On POSIX, with shell=True: If args is a string, it specifies the | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 48 | command string to execute through the shell.  If args is a sequence, | 
 | 49 | the first item specifies the command string, and any additional items | 
 | 50 | will be treated as additional shell arguments. | 
 | 51 |  | 
 | 52 | On Windows: the Popen class uses CreateProcess() to execute the child | 
 | 53 | program, which operates on strings.  If args is a sequence, it will be | 
 | 54 | converted to a string using the list2cmdline method.  Please note that | 
 | 55 | not all MS Windows applications interpret the command line the same | 
 | 56 | way: The list2cmdline is designed for applications using the same | 
 | 57 | rules as the MS C runtime. | 
 | 58 |  | 
| Gregory P. Smith | a1ed539 | 2013-03-23 11:44:25 -0700 | [diff] [blame] | 59 | bufsize will be supplied as the corresponding argument to the io.open() | 
 | 60 | function when creating the stdin/stdout/stderr pipe file objects: | 
 | 61 | 0 means unbuffered (read & write are one system call and can return short), | 
 | 62 | 1 means line buffered, any other positive value means use a buffer of | 
 | 63 | approximately that size.  A negative bufsize, the default, means the system | 
 | 64 | default of io.DEFAULT_BUFFER_SIZE will be used. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 65 |  | 
 | 66 | stdin, stdout and stderr specify the executed programs' standard | 
 | 67 | input, standard output and standard error file handles, respectively. | 
 | 68 | Valid values are PIPE, an existing file descriptor (a positive | 
 | 69 | integer), an existing file object, and None.  PIPE indicates that a | 
 | 70 | new pipe to the child should be created.  With None, no redirection | 
 | 71 | will occur; the child's file handles will be inherited from the | 
 | 72 | parent.  Additionally, stderr can be STDOUT, which indicates that the | 
 | 73 | stderr data from the applications should be captured into the same | 
 | 74 | file handle as for stdout. | 
 | 75 |  | 
| Gregory P. Smith | f560485 | 2010-12-13 06:45:02 +0000 | [diff] [blame] | 76 | On POSIX, if preexec_fn is set to a callable object, this object will be | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 77 | called in the child process just before the child is executed.  The use | 
 | 78 | of preexec_fn is not thread safe, using it in the presence of threads | 
 | 79 | could lead to a deadlock in the child process before the new executable | 
 | 80 | is executed. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 81 |  | 
 | 82 | If close_fds is true, all file descriptors except 0, 1 and 2 will be | 
| Gregory P. Smith | f560485 | 2010-12-13 06:45:02 +0000 | [diff] [blame] | 83 | closed before the child process is executed.  The default for close_fds | 
| Gregory P. Smith | 8edd99d | 2010-12-14 13:43:30 +0000 | [diff] [blame] | 84 | varies by platform:  Always true on POSIX.  True when stdin/stdout/stderr | 
 | 85 | are None on Windows, false otherwise. | 
 | 86 |  | 
 | 87 | pass_fds is an optional sequence of file descriptors to keep open between the | 
 | 88 | parent and child.  Providing any pass_fds implicitly sets close_fds to true. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 89 |  | 
 | 90 | if shell is true, the specified command will be executed through the | 
 | 91 | shell. | 
 | 92 |  | 
 | 93 | If cwd is not None, the current directory will be changed to cwd | 
 | 94 | before the child is executed. | 
 | 95 |  | 
| Gregory P. Smith | f560485 | 2010-12-13 06:45:02 +0000 | [diff] [blame] | 96 | On POSIX, if restore_signals is True all signals that Python sets to | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 97 | SIG_IGN are restored to SIG_DFL in the child process before the exec. | 
 | 98 | Currently this includes the SIGPIPE, SIGXFZ and SIGXFSZ signals.  This | 
 | 99 | parameter does nothing on Windows. | 
 | 100 |  | 
| Gregory P. Smith | f560485 | 2010-12-13 06:45:02 +0000 | [diff] [blame] | 101 | On POSIX, if start_new_session is True, the setsid() system call will be made | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 102 | in the child process prior to executing the command. | 
 | 103 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 104 | If env is not None, it defines the environment variables for the new | 
 | 105 | process. | 
 | 106 |  | 
 | 107 | If universal_newlines is true, the file objects stdout and stderr are | 
 | 108 | opened as a text files, but lines may be terminated by any of '\n', | 
| Gregory P. Smith | f560485 | 2010-12-13 06:45:02 +0000 | [diff] [blame] | 109 | the Unix end-of-line convention, '\r', the old Macintosh convention or | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 110 | '\r\n', the Windows convention.  All of these external representations | 
| Gregory P. Smith | 1f8a40b | 2013-03-20 18:32:03 -0700 | [diff] [blame] | 111 | are seen as '\n' by the Python program.  Also, the newlines attribute | 
 | 112 | of the file objects stdout, stdin and stderr are not updated by the | 
 | 113 | communicate() method. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 114 |  | 
 | 115 | The startupinfo and creationflags, if given, will be passed to the | 
 | 116 | underlying CreateProcess() function.  They can specify things such as | 
 | 117 | appearance of the main window and priority for the new process. | 
 | 118 | (Windows only) | 
 | 119 |  | 
 | 120 |  | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 121 | This module also defines some shortcut functions: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 122 |  | 
| Peter Astrand | 5f5e141 | 2004-12-05 20:15:36 +0000 | [diff] [blame] | 123 | call(*popenargs, **kwargs): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 124 |     Run command with arguments.  Wait for command to complete, then | 
 | 125 |     return the returncode attribute. | 
 | 126 |  | 
 | 127 |     The arguments are the same as for the Popen constructor.  Example: | 
 | 128 |  | 
| Florent Xicluna | 4886d24 | 2010-03-08 13:27:26 +0000 | [diff] [blame] | 129 |     >>> retcode = subprocess.call(["ls", "-l"]) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 130 |  | 
| Peter Astrand | 454f767 | 2005-01-01 09:36:35 +0000 | [diff] [blame] | 131 | check_call(*popenargs, **kwargs): | 
 | 132 |     Run command with arguments.  Wait for command to complete.  If the | 
 | 133 |     exit code was zero then return, otherwise raise | 
 | 134 |     CalledProcessError.  The CalledProcessError object will have the | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 135 |     return code in the returncode attribute. | 
| Peter Astrand | 454f767 | 2005-01-01 09:36:35 +0000 | [diff] [blame] | 136 |  | 
 | 137 |     The arguments are the same as for the Popen constructor.  Example: | 
 | 138 |  | 
| Florent Xicluna | 4886d24 | 2010-03-08 13:27:26 +0000 | [diff] [blame] | 139 |     >>> subprocess.check_call(["ls", "-l"]) | 
| Georg Brandl | 2708f3a | 2009-12-20 14:38:23 +0000 | [diff] [blame] | 140 |     0 | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 141 |  | 
| Brett Cannon | a23810f | 2008-05-26 19:04:21 +0000 | [diff] [blame] | 142 | getstatusoutput(cmd): | 
 | 143 |     Return (status, output) of executing cmd in a shell. | 
 | 144 |  | 
 | 145 |     Execute the string 'cmd' in a shell with os.popen() and return a 2-tuple | 
 | 146 |     (status, output).  cmd is actually run as '{ cmd ; } 2>&1', so that the | 
 | 147 |     returned output will contain output or error messages. A trailing newline | 
 | 148 |     is stripped from the output. The exit status for the command can be | 
 | 149 |     interpreted according to the rules for the C function wait().  Example: | 
 | 150 |  | 
| Brett Cannon | a23810f | 2008-05-26 19:04:21 +0000 | [diff] [blame] | 151 |     >>> subprocess.getstatusoutput('ls /bin/ls') | 
 | 152 |     (0, '/bin/ls') | 
 | 153 |     >>> subprocess.getstatusoutput('cat /bin/junk') | 
 | 154 |     (256, 'cat: /bin/junk: No such file or directory') | 
 | 155 |     >>> subprocess.getstatusoutput('/bin/junk') | 
 | 156 |     (256, 'sh: /bin/junk: not found') | 
 | 157 |  | 
 | 158 | getoutput(cmd): | 
 | 159 |     Return output (stdout or stderr) of executing cmd in a shell. | 
 | 160 |  | 
 | 161 |     Like getstatusoutput(), except the exit status is ignored and the return | 
 | 162 |     value is a string containing the command's output.  Example: | 
 | 163 |  | 
| Brett Cannon | a23810f | 2008-05-26 19:04:21 +0000 | [diff] [blame] | 164 |     >>> subprocess.getoutput('ls /bin/ls') | 
 | 165 |     '/bin/ls' | 
 | 166 |  | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 167 | check_output(*popenargs, **kwargs): | 
| Gregory P. Smith | 91110f5 | 2013-03-19 23:25:16 -0700 | [diff] [blame] | 168 |     Run command with arguments and return its output. | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 169 |  | 
| Georg Brandl | 2708f3a | 2009-12-20 14:38:23 +0000 | [diff] [blame] | 170 |     If the exit code was non-zero it raises a CalledProcessError.  The | 
 | 171 |     CalledProcessError object will have the return code in the returncode | 
 | 172 |     attribute and output in the output attribute. | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 173 |  | 
| Georg Brandl | 2708f3a | 2009-12-20 14:38:23 +0000 | [diff] [blame] | 174 |     The arguments are the same as for the Popen constructor.  Example: | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 175 |  | 
| Georg Brandl | 2708f3a | 2009-12-20 14:38:23 +0000 | [diff] [blame] | 176 |     >>> output = subprocess.check_output(["ls", "-l", "/dev/null"]) | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 177 |  | 
| Serhiy Storchaka | fcd9f22 | 2013-04-22 20:20:54 +0300 | [diff] [blame] | 178 |     There is an additional optional argument, "input", allowing you to | 
 | 179 |     pass a string to the subprocess's stdin.  If you use this argument | 
 | 180 |     you may not also use the Popen constructor's "stdin" argument. | 
| Brett Cannon | a23810f | 2008-05-26 19:04:21 +0000 | [diff] [blame] | 181 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 182 | Exceptions | 
 | 183 | ---------- | 
 | 184 | Exceptions raised in the child process, before the new program has | 
 | 185 | started to execute, will be re-raised in the parent.  Additionally, | 
 | 186 | the exception object will have one extra attribute called | 
 | 187 | 'child_traceback', which is a string containing traceback information | 
 | 188 | from the childs point of view. | 
 | 189 |  | 
 | 190 | The most common exception raised is OSError.  This occurs, for | 
 | 191 | example, when trying to execute a non-existent file.  Applications | 
 | 192 | should prepare for OSErrors. | 
 | 193 |  | 
 | 194 | A ValueError will be raised if Popen is called with invalid arguments. | 
 | 195 |  | 
| Gregory P. Smith | 54d412e | 2011-03-14 14:08:43 -0400 | [diff] [blame] | 196 | Exceptions defined within this module inherit from SubprocessError. | 
 | 197 | check_call() and check_output() will raise CalledProcessError if the | 
| Gregory P. Smith | b4039aa | 2011-03-14 14:16:20 -0400 | [diff] [blame] | 198 | called process returns a non-zero return code.  TimeoutExpired | 
| Gregory P. Smith | 54d412e | 2011-03-14 14:08:43 -0400 | [diff] [blame] | 199 | be raised if a timeout was specified and expired. | 
| Peter Astrand | 454f767 | 2005-01-01 09:36:35 +0000 | [diff] [blame] | 200 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 201 |  | 
 | 202 | Security | 
 | 203 | -------- | 
 | 204 | Unlike some other popen functions, this implementation will never call | 
 | 205 | /bin/sh implicitly.  This means that all characters, including shell | 
 | 206 | metacharacters, can safely be passed to child processes. | 
 | 207 |  | 
 | 208 |  | 
 | 209 | Popen objects | 
 | 210 | ============= | 
 | 211 | Instances of the Popen class have the following methods: | 
 | 212 |  | 
 | 213 | poll() | 
 | 214 |     Check if child process has terminated.  Returns returncode | 
 | 215 |     attribute. | 
 | 216 |  | 
 | 217 | wait() | 
 | 218 |     Wait for child process to terminate.  Returns returncode attribute. | 
 | 219 |  | 
 | 220 | communicate(input=None) | 
 | 221 |     Interact with process: Send data to stdin.  Read data from stdout | 
 | 222 |     and stderr, until end-of-file is reached.  Wait for process to | 
| Thomas Wouters | 902d6eb | 2007-01-09 23:18:33 +0000 | [diff] [blame] | 223 |     terminate.  The optional input argument should be a string to be | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 224 |     sent to the child process, or None, if no data should be sent to | 
 | 225 |     the child. | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 226 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 227 |     communicate() returns a tuple (stdout, stderr). | 
 | 228 |  | 
 | 229 |     Note: The data read is buffered in memory, so do not use this | 
 | 230 |     method if the data size is large or unlimited. | 
 | 231 |  | 
 | 232 | The following attributes are also available: | 
 | 233 |  | 
 | 234 | stdin | 
 | 235 |     If the stdin argument is PIPE, this attribute is a file object | 
 | 236 |     that provides input to the child process.  Otherwise, it is None. | 
 | 237 |  | 
 | 238 | stdout | 
 | 239 |     If the stdout argument is PIPE, this attribute is a file object | 
 | 240 |     that provides output from the child process.  Otherwise, it is | 
 | 241 |     None. | 
 | 242 |  | 
 | 243 | stderr | 
 | 244 |     If the stderr argument is PIPE, this attribute is file object that | 
 | 245 |     provides error output from the child process.  Otherwise, it is | 
 | 246 |     None. | 
 | 247 |  | 
 | 248 | pid | 
 | 249 |     The process ID of the child process. | 
 | 250 |  | 
 | 251 | returncode | 
 | 252 |     The child return code.  A None value indicates that the process | 
 | 253 |     hasn't terminated yet.  A negative value -N indicates that the | 
| Gregory P. Smith | f560485 | 2010-12-13 06:45:02 +0000 | [diff] [blame] | 254 |     child was terminated by signal N (POSIX only). | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 255 |  | 
 | 256 |  | 
 | 257 | Replacing older functions with the subprocess module | 
 | 258 | ==================================================== | 
 | 259 | In this section, "a ==> b" means that b can be used as a replacement | 
 | 260 | for a. | 
 | 261 |  | 
 | 262 | Note: All functions in this section fail (more or less) silently if | 
 | 263 | the executed program cannot be found; this module raises an OSError | 
 | 264 | exception. | 
 | 265 |  | 
 | 266 | In the following examples, we assume that the subprocess module is | 
 | 267 | imported with "from subprocess import *". | 
 | 268 |  | 
 | 269 |  | 
 | 270 | Replacing /bin/sh shell backquote | 
 | 271 | --------------------------------- | 
 | 272 | output=`mycmd myarg` | 
 | 273 | ==> | 
 | 274 | output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] | 
 | 275 |  | 
 | 276 |  | 
 | 277 | Replacing shell pipe line | 
 | 278 | ------------------------- | 
 | 279 | output=`dmesg | grep hda` | 
 | 280 | ==> | 
 | 281 | p1 = Popen(["dmesg"], stdout=PIPE) | 
| Peter Astrand | 6fdf3cb | 2004-11-30 18:06:42 +0000 | [diff] [blame] | 282 | p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 283 | output = p2.communicate()[0] | 
 | 284 |  | 
 | 285 |  | 
 | 286 | Replacing os.system() | 
 | 287 | --------------------- | 
 | 288 | sts = os.system("mycmd" + " myarg") | 
 | 289 | ==> | 
 | 290 | p = Popen("mycmd" + " myarg", shell=True) | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 291 | pid, sts = os.waitpid(p.pid, 0) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 292 |  | 
 | 293 | Note: | 
 | 294 |  | 
 | 295 | * Calling the program through the shell is usually not required. | 
 | 296 |  | 
 | 297 | * It's easier to look at the returncode attribute than the | 
 | 298 |   exitstatus. | 
 | 299 |  | 
 | 300 | A more real-world example would look like this: | 
 | 301 |  | 
 | 302 | try: | 
 | 303 |     retcode = call("mycmd" + " myarg", shell=True) | 
 | 304 |     if retcode < 0: | 
| Guido van Rossum | c2f93dc | 2007-05-24 00:50:02 +0000 | [diff] [blame] | 305 |         print("Child was terminated by signal", -retcode, file=sys.stderr) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 306 |     else: | 
| Guido van Rossum | c2f93dc | 2007-05-24 00:50:02 +0000 | [diff] [blame] | 307 |         print("Child returned", retcode, file=sys.stderr) | 
 | 308 | except OSError as e: | 
 | 309 |     print("Execution failed:", e, file=sys.stderr) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 310 |  | 
 | 311 |  | 
 | 312 | Replacing os.spawn* | 
 | 313 | ------------------- | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 314 | P_NOWAIT example: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 315 |  | 
 | 316 | pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg") | 
 | 317 | ==> | 
 | 318 | pid = Popen(["/bin/mycmd", "myarg"]).pid | 
 | 319 |  | 
 | 320 |  | 
 | 321 | P_WAIT example: | 
 | 322 |  | 
 | 323 | retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg") | 
 | 324 | ==> | 
 | 325 | retcode = call(["/bin/mycmd", "myarg"]) | 
 | 326 |  | 
 | 327 |  | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 328 | Vector example: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 329 |  | 
 | 330 | os.spawnvp(os.P_NOWAIT, path, args) | 
 | 331 | ==> | 
 | 332 | Popen([path] + args[1:]) | 
 | 333 |  | 
 | 334 |  | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 335 | Environment example: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 336 |  | 
 | 337 | os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) | 
 | 338 | ==> | 
 | 339 | Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"}) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 340 | """ | 
 | 341 |  | 
 | 342 | import sys | 
 | 343 | mswindows = (sys.platform == "win32") | 
 | 344 |  | 
| Guido van Rossum | fa0054a | 2007-05-24 04:05:35 +0000 | [diff] [blame] | 345 | import io | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 346 | import os | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 347 | import time | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 348 | import traceback | 
| Christian Heimes | fdab48e | 2008-01-20 09:06:41 +0000 | [diff] [blame] | 349 | import gc | 
| Christian Heimes | a342c01 | 2008-04-20 21:01:16 +0000 | [diff] [blame] | 350 | import signal | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 351 | import builtins | 
| Gregory P. Smith | d23047b | 2010-12-04 09:10:44 +0000 | [diff] [blame] | 352 | import warnings | 
| Ross Lagerwall | 4f61b02 | 2011-04-05 15:34:00 +0200 | [diff] [blame] | 353 | import errno | 
| Victor Stinner | 949d8c9 | 2012-05-30 13:30:32 +0200 | [diff] [blame] | 354 | try: | 
 | 355 |     from time import monotonic as _time | 
| Brett Cannon | 0a14066 | 2013-06-13 20:57:26 -0400 | [diff] [blame] | 356 | except ModuleNotFoundError: | 
| Victor Stinner | 949d8c9 | 2012-05-30 13:30:32 +0200 | [diff] [blame] | 357 |     from time import time as _time | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 358 |  | 
| Peter Astrand | 454f767 | 2005-01-01 09:36:35 +0000 | [diff] [blame] | 359 | # Exception classes used by this module. | 
| Gregory P. Smith | 54d412e | 2011-03-14 14:08:43 -0400 | [diff] [blame] | 360 | class SubprocessError(Exception): pass | 
 | 361 |  | 
 | 362 |  | 
 | 363 | class CalledProcessError(SubprocessError): | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 364 |     """This exception is raised when a process run by check_call() or | 
 | 365 |     check_output() returns a non-zero exit status. | 
 | 366 |     The exit status will be stored in the returncode attribute; | 
 | 367 |     check_output() will also store the output in the output attribute. | 
 | 368 |     """ | 
 | 369 |     def __init__(self, returncode, cmd, output=None): | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 370 |         self.returncode = returncode | 
 | 371 |         self.cmd = cmd | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 372 |         self.output = output | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 373 |     def __str__(self): | 
 | 374 |         return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode) | 
 | 375 |  | 
| Peter Astrand | 454f767 | 2005-01-01 09:36:35 +0000 | [diff] [blame] | 376 |  | 
| Gregory P. Smith | 54d412e | 2011-03-14 14:08:43 -0400 | [diff] [blame] | 377 | class TimeoutExpired(SubprocessError): | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 378 |     """This exception is raised when the timeout expires while waiting for a | 
 | 379 |     child process. | 
 | 380 |     """ | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 381 |     def __init__(self, cmd, timeout, output=None): | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 382 |         self.cmd = cmd | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 383 |         self.timeout = timeout | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 384 |         self.output = output | 
 | 385 |  | 
 | 386 |     def __str__(self): | 
 | 387 |         return ("Command '%s' timed out after %s seconds" % | 
 | 388 |                 (self.cmd, self.timeout)) | 
 | 389 |  | 
 | 390 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 391 | if mswindows: | 
 | 392 |     import threading | 
 | 393 |     import msvcrt | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 394 |     import _winapi | 
| Brian Curtin | 1ce6b58 | 2010-04-24 16:19:22 +0000 | [diff] [blame] | 395 |     class STARTUPINFO: | 
 | 396 |         dwFlags = 0 | 
 | 397 |         hStdInput = None | 
 | 398 |         hStdOutput = None | 
 | 399 |         hStdError = None | 
 | 400 |         wShowWindow = 0 | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 401 | else: | 
 | 402 |     import select | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 403 |     _has_poll = hasattr(select, 'poll') | 
| Gregory P. Smith | 59fd1bf | 2011-05-28 09:32:39 -0700 | [diff] [blame] | 404 |     import _posixsubprocess | 
 | 405 |     _create_pipe = _posixsubprocess.cloexec_pipe | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 406 |  | 
| Amaury Forgeot d'Arc | ace3102 | 2009-07-09 22:44:11 +0000 | [diff] [blame] | 407 |     # When select or poll has indicated that the file is writable, | 
 | 408 |     # we can write up to _PIPE_BUF bytes without risk of blocking. | 
 | 409 |     # POSIX defines PIPE_BUF as >= 512. | 
 | 410 |     _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) | 
 | 411 |  | 
 | 412 |  | 
| Brett Cannon | a23810f | 2008-05-26 19:04:21 +0000 | [diff] [blame] | 413 | __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput", | 
| Ross Lagerwall | ba102ec | 2011-03-16 18:40:25 +0200 | [diff] [blame] | 414 |            "getoutput", "check_output", "CalledProcessError", "DEVNULL"] | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 415 |  | 
| Brian Curtin | 1ce6b58 | 2010-04-24 16:19:22 +0000 | [diff] [blame] | 416 | if mswindows: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 417 |     from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, | 
 | 418 |                          STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, | 
 | 419 |                          STD_ERROR_HANDLE, SW_HIDE, | 
 | 420 |                          STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW) | 
| Brian Curtin | 5d9deaa | 2011-04-29 16:24:07 -0500 | [diff] [blame] | 421 |  | 
| Brian Curtin | 08fd8d9 | 2011-04-29 16:11:30 -0500 | [diff] [blame] | 422 |     __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP", | 
| Brian Curtin | 8b8e7f4 | 2011-04-29 15:48:13 -0500 | [diff] [blame] | 423 |                     "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE", | 
 | 424 |                     "STD_ERROR_HANDLE", "SW_HIDE", | 
 | 425 |                     "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW"]) | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 426 |  | 
 | 427 |     class Handle(int): | 
 | 428 |         closed = False | 
 | 429 |  | 
 | 430 |         def Close(self, CloseHandle=_winapi.CloseHandle): | 
 | 431 |             if not self.closed: | 
 | 432 |                 self.closed = True | 
 | 433 |                 CloseHandle(self) | 
 | 434 |  | 
 | 435 |         def Detach(self): | 
 | 436 |             if not self.closed: | 
 | 437 |                 self.closed = True | 
 | 438 |                 return int(self) | 
 | 439 |             raise ValueError("already closed") | 
 | 440 |  | 
 | 441 |         def __repr__(self): | 
 | 442 |             return "Handle(%d)" % int(self) | 
 | 443 |  | 
 | 444 |         __del__ = Close | 
 | 445 |         __str__ = __repr__ | 
 | 446 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 447 | try: | 
 | 448 |     MAXFD = os.sysconf("SC_OPEN_MAX") | 
 | 449 | except: | 
 | 450 |     MAXFD = 256 | 
 | 451 |  | 
| Charles-François Natali | 134a8ba | 2011-08-18 18:49:39 +0200 | [diff] [blame] | 452 | # This lists holds Popen instances for which the underlying process had not | 
 | 453 | # exited at the time its __del__ method got called: those processes are wait()ed | 
 | 454 | # for synchronously from _cleanup() when a new Popen object is created, to avoid | 
 | 455 | # zombie processes. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 456 | _active = [] | 
 | 457 |  | 
 | 458 | def _cleanup(): | 
 | 459 |     for inst in _active[:]: | 
| Georg Brandl | 6aa2d1f | 2008-08-12 08:35:52 +0000 | [diff] [blame] | 460 |         res = inst._internal_poll(_deadstate=sys.maxsize) | 
| Charles-François Natali | 134a8ba | 2011-08-18 18:49:39 +0200 | [diff] [blame] | 461 |         if res is not None: | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 462 |             try: | 
 | 463 |                 _active.remove(inst) | 
 | 464 |             except ValueError: | 
 | 465 |                 # This can happen if two threads create a new Popen instance. | 
 | 466 |                 # It's harmless that it was already removed, so ignore. | 
 | 467 |                 pass | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 468 |  | 
 | 469 | PIPE = -1 | 
 | 470 | STDOUT = -2 | 
| Ross Lagerwall | ba102ec | 2011-03-16 18:40:25 +0200 | [diff] [blame] | 471 | DEVNULL = -3 | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 472 |  | 
 | 473 |  | 
| Gregory P. Smith | a59c59f | 2010-03-01 00:17:40 +0000 | [diff] [blame] | 474 | def _eintr_retry_call(func, *args): | 
 | 475 |     while True: | 
 | 476 |         try: | 
 | 477 |             return func(*args) | 
| Antoine Pitrou | 24d659d | 2011-10-23 23:49:42 +0200 | [diff] [blame] | 478 |         except InterruptedError: | 
 | 479 |             continue | 
| Gregory P. Smith | a59c59f | 2010-03-01 00:17:40 +0000 | [diff] [blame] | 480 |  | 
 | 481 |  | 
| Antoine Pitrou | ebdcd85 | 2012-05-18 18:33:07 +0200 | [diff] [blame] | 482 | # XXX This function is only used by multiprocessing and the test suite, | 
 | 483 | # but it's here so that it can be imported when Python is compiled without | 
 | 484 | # threads. | 
 | 485 |  | 
 | 486 | def _args_from_interpreter_flags(): | 
 | 487 |     """Return a list of command-line arguments reproducing the current | 
 | 488 |     settings in sys.flags and sys.warnoptions.""" | 
 | 489 |     flag_opt_map = { | 
 | 490 |         'debug': 'd', | 
 | 491 |         # 'inspect': 'i', | 
 | 492 |         # 'interactive': 'i', | 
 | 493 |         'optimize': 'O', | 
 | 494 |         'dont_write_bytecode': 'B', | 
 | 495 |         'no_user_site': 's', | 
 | 496 |         'no_site': 'S', | 
 | 497 |         'ignore_environment': 'E', | 
 | 498 |         'verbose': 'v', | 
 | 499 |         'bytes_warning': 'b', | 
 | 500 |         'quiet': 'q', | 
 | 501 |         'hash_randomization': 'R', | 
 | 502 |     } | 
 | 503 |     args = [] | 
 | 504 |     for flag, opt in flag_opt_map.items(): | 
 | 505 |         v = getattr(sys.flags, flag) | 
 | 506 |         if v > 0: | 
 | 507 |             args.append('-' + opt * v) | 
 | 508 |     for opt in sys.warnoptions: | 
 | 509 |         args.append('-W' + opt) | 
 | 510 |     return args | 
 | 511 |  | 
 | 512 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 513 | def call(*popenargs, timeout=None, **kwargs): | 
 | 514 |     """Run command with arguments.  Wait for command to complete or | 
 | 515 |     timeout, then return the returncode attribute. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 516 |  | 
 | 517 |     The arguments are the same as for the Popen constructor.  Example: | 
 | 518 |  | 
 | 519 |     retcode = call(["ls", "-l"]) | 
 | 520 |     """ | 
| Victor Stinner | c15c88c | 2011-09-01 23:45:04 +0200 | [diff] [blame] | 521 |     with Popen(*popenargs, **kwargs) as p: | 
 | 522 |         try: | 
 | 523 |             return p.wait(timeout=timeout) | 
 | 524 |         except: | 
 | 525 |             p.kill() | 
 | 526 |             p.wait() | 
 | 527 |             raise | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 528 |  | 
 | 529 |  | 
| Peter Astrand | 454f767 | 2005-01-01 09:36:35 +0000 | [diff] [blame] | 530 | def check_call(*popenargs, **kwargs): | 
 | 531 |     """Run command with arguments.  Wait for command to complete.  If | 
 | 532 |     the exit code was zero then return, otherwise raise | 
 | 533 |     CalledProcessError.  The CalledProcessError object will have the | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 534 |     return code in the returncode attribute. | 
| Peter Astrand | 454f767 | 2005-01-01 09:36:35 +0000 | [diff] [blame] | 535 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 536 |     The arguments are the same as for the call function.  Example: | 
| Peter Astrand | 454f767 | 2005-01-01 09:36:35 +0000 | [diff] [blame] | 537 |  | 
 | 538 |     check_call(["ls", "-l"]) | 
 | 539 |     """ | 
 | 540 |     retcode = call(*popenargs, **kwargs) | 
| Peter Astrand | 454f767 | 2005-01-01 09:36:35 +0000 | [diff] [blame] | 541 |     if retcode: | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 542 |         cmd = kwargs.get("args") | 
 | 543 |         if cmd is None: | 
 | 544 |             cmd = popenargs[0] | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 545 |         raise CalledProcessError(retcode, cmd) | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 546 |     return 0 | 
 | 547 |  | 
 | 548 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 549 | def check_output(*popenargs, timeout=None, **kwargs): | 
| Gregory P. Smith | 91110f5 | 2013-03-19 23:25:16 -0700 | [diff] [blame] | 550 |     r"""Run command with arguments and return its output. | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 551 |  | 
 | 552 |     If the exit code was non-zero it raises a CalledProcessError.  The | 
 | 553 |     CalledProcessError object will have the return code in the returncode | 
 | 554 |     attribute and output in the output attribute. | 
 | 555 |  | 
 | 556 |     The arguments are the same as for the Popen constructor.  Example: | 
 | 557 |  | 
 | 558 |     >>> check_output(["ls", "-l", "/dev/null"]) | 
| Georg Brandl | 2708f3a | 2009-12-20 14:38:23 +0000 | [diff] [blame] | 559 |     b'crw-rw-rw- 1 root root 1, 3 Oct 18  2007 /dev/null\n' | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 560 |  | 
 | 561 |     The stdout argument is not allowed as it is used internally. | 
| Georg Brandl | 127d470 | 2009-12-28 08:10:38 +0000 | [diff] [blame] | 562 |     To capture standard error in the result, use stderr=STDOUT. | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 563 |  | 
 | 564 |     >>> check_output(["/bin/sh", "-c", | 
| Georg Brandl | 2708f3a | 2009-12-20 14:38:23 +0000 | [diff] [blame] | 565 |     ...               "ls -l non_existent_file ; exit 0"], | 
| Georg Brandl | 127d470 | 2009-12-28 08:10:38 +0000 | [diff] [blame] | 566 |     ...              stderr=STDOUT) | 
| Georg Brandl | 2708f3a | 2009-12-20 14:38:23 +0000 | [diff] [blame] | 567 |     b'ls: non_existent_file: No such file or directory\n' | 
| Gregory P. Smith | 91110f5 | 2013-03-19 23:25:16 -0700 | [diff] [blame] | 568 |  | 
| Serhiy Storchaka | fcd9f22 | 2013-04-22 20:20:54 +0300 | [diff] [blame] | 569 |     There is an additional optional argument, "input", allowing you to | 
 | 570 |     pass a string to the subprocess's stdin.  If you use this argument | 
 | 571 |     you may not also use the Popen constructor's "stdin" argument, as | 
 | 572 |     it too will be used internally.  Example: | 
 | 573 |  | 
 | 574 |     >>> check_output(["sed", "-e", "s/foo/bar/"], | 
 | 575 |     ...              input=b"when in the course of fooman events\n") | 
 | 576 |     b'when in the course of barman events\n' | 
 | 577 |  | 
| Gregory P. Smith | 91110f5 | 2013-03-19 23:25:16 -0700 | [diff] [blame] | 578 |     If universal_newlines=True is passed, the return value will be a | 
 | 579 |     string rather than bytes. | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 580 |     """ | 
 | 581 |     if 'stdout' in kwargs: | 
 | 582 |         raise ValueError('stdout argument not allowed, it will be overridden.') | 
| Serhiy Storchaka | fcd9f22 | 2013-04-22 20:20:54 +0300 | [diff] [blame] | 583 |     if 'input' in kwargs: | 
 | 584 |         if 'stdin' in kwargs: | 
 | 585 |             raise ValueError('stdin and input arguments may not both be used.') | 
 | 586 |         inputdata = kwargs['input'] | 
 | 587 |         del kwargs['input'] | 
 | 588 |         kwargs['stdin'] = PIPE | 
 | 589 |     else: | 
 | 590 |         inputdata = None | 
| Victor Stinner | c15c88c | 2011-09-01 23:45:04 +0200 | [diff] [blame] | 591 |     with Popen(*popenargs, stdout=PIPE, **kwargs) as process: | 
 | 592 |         try: | 
| Serhiy Storchaka | fcd9f22 | 2013-04-22 20:20:54 +0300 | [diff] [blame] | 593 |             output, unused_err = process.communicate(inputdata, timeout=timeout) | 
| Victor Stinner | c15c88c | 2011-09-01 23:45:04 +0200 | [diff] [blame] | 594 |         except TimeoutExpired: | 
 | 595 |             process.kill() | 
 | 596 |             output, unused_err = process.communicate() | 
 | 597 |             raise TimeoutExpired(process.args, timeout, output=output) | 
 | 598 |         except: | 
 | 599 |             process.kill() | 
 | 600 |             process.wait() | 
 | 601 |             raise | 
 | 602 |         retcode = process.poll() | 
 | 603 |         if retcode: | 
 | 604 |             raise CalledProcessError(retcode, process.args, output=output) | 
| Georg Brandl | f973407 | 2008-12-07 15:30:06 +0000 | [diff] [blame] | 605 |     return output | 
| Peter Astrand | 454f767 | 2005-01-01 09:36:35 +0000 | [diff] [blame] | 606 |  | 
 | 607 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 608 | def list2cmdline(seq): | 
 | 609 |     """ | 
 | 610 |     Translate a sequence of arguments into a command line | 
 | 611 |     string, using the same rules as the MS C runtime: | 
 | 612 |  | 
 | 613 |     1) Arguments are delimited by white space, which is either a | 
 | 614 |        space or a tab. | 
 | 615 |  | 
 | 616 |     2) A string surrounded by double quotation marks is | 
 | 617 |        interpreted as a single argument, regardless of white space | 
| Jean-Paul Calderone | 1ddd407 | 2010-06-18 20:03:54 +0000 | [diff] [blame] | 618 |        contained within.  A quoted string can be embedded in an | 
 | 619 |        argument. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 620 |  | 
 | 621 |     3) A double quotation mark preceded by a backslash is | 
 | 622 |        interpreted as a literal double quotation mark. | 
 | 623 |  | 
 | 624 |     4) Backslashes are interpreted literally, unless they | 
 | 625 |        immediately precede a double quotation mark. | 
 | 626 |  | 
 | 627 |     5) If backslashes immediately precede a double quotation mark, | 
 | 628 |        every pair of backslashes is interpreted as a literal | 
 | 629 |        backslash.  If the number of backslashes is odd, the last | 
 | 630 |        backslash escapes the next double quotation mark as | 
 | 631 |        described in rule 3. | 
 | 632 |     """ | 
 | 633 |  | 
 | 634 |     # See | 
| Eric Smith | 3c573af | 2009-11-09 15:23:15 +0000 | [diff] [blame] | 635 |     # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx | 
 | 636 |     # or search http://msdn.microsoft.com for | 
 | 637 |     # "Parsing C++ Command-Line Arguments" | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 638 |     result = [] | 
 | 639 |     needquote = False | 
 | 640 |     for arg in seq: | 
 | 641 |         bs_buf = [] | 
 | 642 |  | 
 | 643 |         # Add a space to separate this argument from the others | 
 | 644 |         if result: | 
 | 645 |             result.append(' ') | 
 | 646 |  | 
| Jean-Paul Calderone | 1ddd407 | 2010-06-18 20:03:54 +0000 | [diff] [blame] | 647 |         needquote = (" " in arg) or ("\t" in arg) or not arg | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 648 |         if needquote: | 
 | 649 |             result.append('"') | 
 | 650 |  | 
 | 651 |         for c in arg: | 
 | 652 |             if c == '\\': | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 653 |                 # Don't know if we need to double yet. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 654 |                 bs_buf.append(c) | 
 | 655 |             elif c == '"': | 
| Christian Heimes | fdab48e | 2008-01-20 09:06:41 +0000 | [diff] [blame] | 656 |                 # Double backslashes. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 657 |                 result.append('\\' * len(bs_buf)*2) | 
 | 658 |                 bs_buf = [] | 
 | 659 |                 result.append('\\"') | 
 | 660 |             else: | 
 | 661 |                 # Normal char | 
 | 662 |                 if bs_buf: | 
 | 663 |                     result.extend(bs_buf) | 
 | 664 |                     bs_buf = [] | 
 | 665 |                 result.append(c) | 
 | 666 |  | 
| Christian Heimes | fdab48e | 2008-01-20 09:06:41 +0000 | [diff] [blame] | 667 |         # Add remaining backslashes, if any. | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 668 |         if bs_buf: | 
 | 669 |             result.extend(bs_buf) | 
 | 670 |  | 
 | 671 |         if needquote: | 
| Peter Astrand | 7e78ade | 2005-03-03 21:10:23 +0000 | [diff] [blame] | 672 |             result.extend(bs_buf) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 673 |             result.append('"') | 
 | 674 |  | 
 | 675 |     return ''.join(result) | 
 | 676 |  | 
 | 677 |  | 
| Brett Cannon | a23810f | 2008-05-26 19:04:21 +0000 | [diff] [blame] | 678 | # Various tools for executing commands and looking at their output and status. | 
 | 679 | # | 
| Gregory P. Smith | f560485 | 2010-12-13 06:45:02 +0000 | [diff] [blame] | 680 | # NB This only works (and is only relevant) for POSIX. | 
| Brett Cannon | a23810f | 2008-05-26 19:04:21 +0000 | [diff] [blame] | 681 |  | 
 | 682 | def getstatusoutput(cmd): | 
 | 683 |     """Return (status, output) of executing cmd in a shell. | 
 | 684 |  | 
 | 685 |     Execute the string 'cmd' in a shell with os.popen() and return a 2-tuple | 
 | 686 |     (status, output).  cmd is actually run as '{ cmd ; } 2>&1', so that the | 
 | 687 |     returned output will contain output or error messages.  A trailing newline | 
 | 688 |     is stripped from the output.  The exit status for the command can be | 
 | 689 |     interpreted according to the rules for the C function wait().  Example: | 
 | 690 |  | 
 | 691 |     >>> import subprocess | 
 | 692 |     >>> subprocess.getstatusoutput('ls /bin/ls') | 
 | 693 |     (0, '/bin/ls') | 
 | 694 |     >>> subprocess.getstatusoutput('cat /bin/junk') | 
 | 695 |     (256, 'cat: /bin/junk: No such file or directory') | 
 | 696 |     >>> subprocess.getstatusoutput('/bin/junk') | 
 | 697 |     (256, 'sh: /bin/junk: not found') | 
 | 698 |     """ | 
| Victor Stinner | c15c88c | 2011-09-01 23:45:04 +0200 | [diff] [blame] | 699 |     with os.popen('{ ' + cmd + '; } 2>&1', 'r') as pipe: | 
 | 700 |         try: | 
 | 701 |             text = pipe.read() | 
 | 702 |             sts = pipe.close() | 
 | 703 |         except: | 
 | 704 |             process = pipe._proc | 
 | 705 |             process.kill() | 
 | 706 |             process.wait() | 
 | 707 |             raise | 
 | 708 |     if sts is None: | 
 | 709 |         sts = 0 | 
 | 710 |     if text[-1:] == '\n': | 
 | 711 |         text = text[:-1] | 
| Brett Cannon | a23810f | 2008-05-26 19:04:21 +0000 | [diff] [blame] | 712 |     return sts, text | 
 | 713 |  | 
 | 714 |  | 
 | 715 | def getoutput(cmd): | 
 | 716 |     """Return output (stdout or stderr) of executing cmd in a shell. | 
 | 717 |  | 
 | 718 |     Like getstatusoutput(), except the exit status is ignored and the return | 
 | 719 |     value is a string containing the command's output.  Example: | 
 | 720 |  | 
 | 721 |     >>> import subprocess | 
 | 722 |     >>> subprocess.getoutput('ls /bin/ls') | 
 | 723 |     '/bin/ls' | 
 | 724 |     """ | 
 | 725 |     return getstatusoutput(cmd)[1] | 
 | 726 |  | 
 | 727 |  | 
| Gregory P. Smith | 8edd99d | 2010-12-14 13:43:30 +0000 | [diff] [blame] | 728 | _PLATFORM_DEFAULT_CLOSE_FDS = object() | 
| Gregory P. Smith | f560485 | 2010-12-13 06:45:02 +0000 | [diff] [blame] | 729 |  | 
 | 730 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 731 | class Popen(object): | 
| Gregory P. Smith | a1ed539 | 2013-03-23 11:44:25 -0700 | [diff] [blame] | 732 |     def __init__(self, args, bufsize=-1, executable=None, | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 733 |                  stdin=None, stdout=None, stderr=None, | 
| Gregory P. Smith | 8edd99d | 2010-12-14 13:43:30 +0000 | [diff] [blame] | 734 |                  preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS, | 
 | 735 |                  shell=False, cwd=None, env=None, universal_newlines=False, | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 736 |                  startupinfo=None, creationflags=0, | 
| Gregory P. Smith | d4cc7bf | 2010-12-04 11:22:11 +0000 | [diff] [blame] | 737 |                  restore_signals=True, start_new_session=False, | 
 | 738 |                  pass_fds=()): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 739 |         """Create new Popen instance.""" | 
 | 740 |         _cleanup() | 
 | 741 |  | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 742 |         self._child_created = False | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 743 |         self._input = None | 
 | 744 |         self._communication_started = False | 
| Guido van Rossum | 46a05a7 | 2007-06-07 21:56:45 +0000 | [diff] [blame] | 745 |         if bufsize is None: | 
| Gregory P. Smith | a1ed539 | 2013-03-23 11:44:25 -0700 | [diff] [blame] | 746 |             bufsize = -1  # Restore default | 
| Walter Dörwald | aa97f04 | 2007-05-03 21:05:51 +0000 | [diff] [blame] | 747 |         if not isinstance(bufsize, int): | 
| Peter Astrand | 738131d | 2004-11-30 21:04:45 +0000 | [diff] [blame] | 748 |             raise TypeError("bufsize must be an integer") | 
 | 749 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 750 |         if mswindows: | 
| Tim Peters | e8374a5 | 2004-10-13 03:15:00 +0000 | [diff] [blame] | 751 |             if preexec_fn is not None: | 
 | 752 |                 raise ValueError("preexec_fn is not supported on Windows " | 
 | 753 |                                  "platforms") | 
| Gregory P. Smith | 8edd99d | 2010-12-14 13:43:30 +0000 | [diff] [blame] | 754 |             any_stdio_set = (stdin is not None or stdout is not None or | 
 | 755 |                              stderr is not None) | 
 | 756 |             if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS: | 
 | 757 |                 if any_stdio_set: | 
 | 758 |                     close_fds = False | 
 | 759 |                 else: | 
 | 760 |                     close_fds = True | 
 | 761 |             elif close_fds and any_stdio_set: | 
 | 762 |                 raise ValueError( | 
 | 763 |                         "close_fds is not supported on Windows platforms" | 
 | 764 |                         " if you redirect stdin/stdout/stderr") | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 765 |         else: | 
 | 766 |             # POSIX | 
| Gregory P. Smith | 8edd99d | 2010-12-14 13:43:30 +0000 | [diff] [blame] | 767 |             if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS: | 
 | 768 |                 close_fds = True | 
 | 769 |             if pass_fds and not close_fds: | 
 | 770 |                 warnings.warn("pass_fds overriding close_fds.", RuntimeWarning) | 
 | 771 |                 close_fds = True | 
| Tim Peters | e8374a5 | 2004-10-13 03:15:00 +0000 | [diff] [blame] | 772 |             if startupinfo is not None: | 
 | 773 |                 raise ValueError("startupinfo is only supported on Windows " | 
 | 774 |                                  "platforms") | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 775 |             if creationflags != 0: | 
| Tim Peters | e8374a5 | 2004-10-13 03:15:00 +0000 | [diff] [blame] | 776 |                 raise ValueError("creationflags is only supported on Windows " | 
 | 777 |                                  "platforms") | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 778 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 779 |         self.args = args | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 780 |         self.stdin = None | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 781 |         self.stdout = None | 
 | 782 |         self.stderr = None | 
 | 783 |         self.pid = None | 
 | 784 |         self.returncode = None | 
 | 785 |         self.universal_newlines = universal_newlines | 
 | 786 |  | 
 | 787 |         # Input and output objects. The general principle is like | 
 | 788 |         # this: | 
 | 789 |         # | 
 | 790 |         # Parent                   Child | 
 | 791 |         # ------                   ----- | 
 | 792 |         # p2cwrite   ---stdin--->  p2cread | 
 | 793 |         # c2pread    <--stdout---  c2pwrite | 
 | 794 |         # errread    <--stderr---  errwrite | 
 | 795 |         # | 
 | 796 |         # On POSIX, the child objects are file descriptors.  On | 
 | 797 |         # Windows, these are Windows file handles.  The parent objects | 
 | 798 |         # are file descriptors on both platforms.  The parent objects | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 799 |         # are -1 when not using PIPEs. The child objects are -1 | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 800 |         # when not redirecting. | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 801 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 802 |         (p2cread, p2cwrite, | 
 | 803 |          c2pread, c2pwrite, | 
 | 804 |          errread, errwrite) = self._get_handles(stdin, stdout, stderr) | 
 | 805 |  | 
| Antoine Pitrou | c998232 | 2011-01-04 19:07:07 +0000 | [diff] [blame] | 806 |         # We wrap OS handles *before* launching the child, otherwise a | 
 | 807 |         # quickly terminating child could make our fds unwrappable | 
 | 808 |         # (see #8458). | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 809 |  | 
| Thomas Wouters | cf297e4 | 2007-02-23 15:07:44 +0000 | [diff] [blame] | 810 |         if mswindows: | 
| Florent Xicluna | 3b8bfef | 2010-03-14 12:31:06 +0000 | [diff] [blame] | 811 |             if p2cwrite != -1: | 
| Hirokazu Yamamoto | 0c98817 | 2009-03-03 22:41:26 +0000 | [diff] [blame] | 812 |                 p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0) | 
| Florent Xicluna | 3b8bfef | 2010-03-14 12:31:06 +0000 | [diff] [blame] | 813 |             if c2pread != -1: | 
| Hirokazu Yamamoto | 0c98817 | 2009-03-03 22:41:26 +0000 | [diff] [blame] | 814 |                 c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0) | 
| Florent Xicluna | 3b8bfef | 2010-03-14 12:31:06 +0000 | [diff] [blame] | 815 |             if errread != -1: | 
| Hirokazu Yamamoto | 0c98817 | 2009-03-03 22:41:26 +0000 | [diff] [blame] | 816 |                 errread = msvcrt.open_osfhandle(errread.Detach(), 0) | 
| Thomas Wouters | cf297e4 | 2007-02-23 15:07:44 +0000 | [diff] [blame] | 817 |  | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 818 |         if p2cwrite != -1: | 
| Guido van Rossum | fa0054a | 2007-05-24 04:05:35 +0000 | [diff] [blame] | 819 |             self.stdin = io.open(p2cwrite, 'wb', bufsize) | 
| Andrew Svetlov | 592df20 | 2012-08-15 17:36:15 +0300 | [diff] [blame] | 820 |             if universal_newlines: | 
| Antoine Pitrou | ab85ff3 | 2011-07-23 22:03:45 +0200 | [diff] [blame] | 821 |                 self.stdin = io.TextIOWrapper(self.stdin, write_through=True) | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 822 |         if c2pread != -1: | 
| Guido van Rossum | fa0054a | 2007-05-24 04:05:35 +0000 | [diff] [blame] | 823 |             self.stdout = io.open(c2pread, 'rb', bufsize) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 824 |             if universal_newlines: | 
| Guido van Rossum | fa0054a | 2007-05-24 04:05:35 +0000 | [diff] [blame] | 825 |                 self.stdout = io.TextIOWrapper(self.stdout) | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 826 |         if errread != -1: | 
| Guido van Rossum | fa0054a | 2007-05-24 04:05:35 +0000 | [diff] [blame] | 827 |             self.stderr = io.open(errread, 'rb', bufsize) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 828 |             if universal_newlines: | 
| Guido van Rossum | fa0054a | 2007-05-24 04:05:35 +0000 | [diff] [blame] | 829 |                 self.stderr = io.TextIOWrapper(self.stderr) | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 830 |  | 
| Gregory P. Smith | b5461b9 | 2013-06-15 18:04:26 -0700 | [diff] [blame] | 831 |         self._closed_child_pipe_fds = False | 
| Antoine Pitrou | c998232 | 2011-01-04 19:07:07 +0000 | [diff] [blame] | 832 |         try: | 
 | 833 |             self._execute_child(args, executable, preexec_fn, close_fds, | 
| Andrew Svetlov | 592df20 | 2012-08-15 17:36:15 +0300 | [diff] [blame] | 834 |                                 pass_fds, cwd, env, | 
| Antoine Pitrou | c998232 | 2011-01-04 19:07:07 +0000 | [diff] [blame] | 835 |                                 startupinfo, creationflags, shell, | 
 | 836 |                                 p2cread, p2cwrite, | 
 | 837 |                                 c2pread, c2pwrite, | 
 | 838 |                                 errread, errwrite, | 
 | 839 |                                 restore_signals, start_new_session) | 
 | 840 |         except: | 
| Gregory P. Smith | 3d8e776 | 2012-11-10 22:32:22 -0800 | [diff] [blame] | 841 |             # Cleanup if the child failed starting. | 
 | 842 |             for f in filter(None, (self.stdin, self.stdout, self.stderr)): | 
| Antoine Pitrou | c998232 | 2011-01-04 19:07:07 +0000 | [diff] [blame] | 843 |                 try: | 
 | 844 |                     f.close() | 
| Andrew Svetlov | 3438fa4 | 2012-12-17 23:35:18 +0200 | [diff] [blame] | 845 |                 except OSError: | 
| Gregory P. Smith | 3d8e776 | 2012-11-10 22:32:22 -0800 | [diff] [blame] | 846 |                     pass  # Ignore EBADF or other errors. | 
 | 847 |  | 
| Gregory P. Smith | b5461b9 | 2013-06-15 18:04:26 -0700 | [diff] [blame] | 848 |             if not self._closed_child_pipe_fds: | 
 | 849 |                 to_close = [] | 
 | 850 |                 if stdin == PIPE: | 
 | 851 |                     to_close.append(p2cread) | 
 | 852 |                 if stdout == PIPE: | 
 | 853 |                     to_close.append(c2pwrite) | 
 | 854 |                 if stderr == PIPE: | 
 | 855 |                     to_close.append(errwrite) | 
 | 856 |                 if hasattr(self, '_devnull'): | 
 | 857 |                     to_close.append(self._devnull) | 
 | 858 |                 for fd in to_close: | 
 | 859 |                     try: | 
 | 860 |                         os.close(fd) | 
| Gregory P. Smith | 22ba31a | 2013-06-15 18:14:56 -0700 | [diff] [blame] | 861 |                     except OSError: | 
| Gregory P. Smith | b5461b9 | 2013-06-15 18:04:26 -0700 | [diff] [blame] | 862 |                         pass | 
| Gregory P. Smith | 3d8e776 | 2012-11-10 22:32:22 -0800 | [diff] [blame] | 863 |  | 
| Antoine Pitrou | c998232 | 2011-01-04 19:07:07 +0000 | [diff] [blame] | 864 |             raise | 
 | 865 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 866 |  | 
| Guido van Rossum | 98297ee | 2007-11-06 21:34:58 +0000 | [diff] [blame] | 867 |     def _translate_newlines(self, data, encoding): | 
| Andrew Svetlov | 8286071 | 2012-08-19 22:13:41 +0300 | [diff] [blame] | 868 |         data = data.decode(encoding) | 
 | 869 |         return data.replace("\r\n", "\n").replace("\r", "\n") | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 870 |  | 
| Brian Curtin | 79cdb66 | 2010-12-03 02:46:02 +0000 | [diff] [blame] | 871 |     def __enter__(self): | 
 | 872 |         return self | 
 | 873 |  | 
 | 874 |     def __exit__(self, type, value, traceback): | 
 | 875 |         if self.stdout: | 
 | 876 |             self.stdout.close() | 
 | 877 |         if self.stderr: | 
 | 878 |             self.stderr.close() | 
 | 879 |         if self.stdin: | 
 | 880 |             self.stdin.close() | 
| Gregory P. Smith | 6b65745 | 2011-05-11 21:42:08 -0700 | [diff] [blame] | 881 |         # Wait for the process to terminate, to avoid zombies. | 
 | 882 |         self.wait() | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 883 |  | 
| Brett Cannon | 84df1e6 | 2010-05-14 00:33:40 +0000 | [diff] [blame] | 884 |     def __del__(self, _maxsize=sys.maxsize, _active=_active): | 
| Victor Stinner | 87b9bc3 | 2011-06-01 00:57:47 +0200 | [diff] [blame] | 885 |         # If __init__ hasn't had a chance to execute (e.g. if it | 
 | 886 |         # was passed an undeclared keyword argument), we don't | 
 | 887 |         # have a _child_created attribute at all. | 
 | 888 |         if not getattr(self, '_child_created', False): | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 889 |             # We didn't get to successfully create a child process. | 
 | 890 |             return | 
 | 891 |         # In case the child hasn't been waited on, check if it's done. | 
| Brett Cannon | 84df1e6 | 2010-05-14 00:33:40 +0000 | [diff] [blame] | 892 |         self._internal_poll(_deadstate=_maxsize) | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 893 |         if self.returncode is None and _active is not None: | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 894 |             # Child is still running, keep us alive until we can wait on it. | 
 | 895 |             _active.append(self) | 
 | 896 |  | 
| Ross Lagerwall | ba102ec | 2011-03-16 18:40:25 +0200 | [diff] [blame] | 897 |     def _get_devnull(self): | 
 | 898 |         if not hasattr(self, '_devnull'): | 
 | 899 |             self._devnull = os.open(os.devnull, os.O_RDWR) | 
 | 900 |         return self._devnull | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 901 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 902 |     def communicate(self, input=None, timeout=None): | 
| Peter Astrand | 23109f0 | 2005-03-03 20:28:59 +0000 | [diff] [blame] | 903 |         """Interact with process: Send data to stdin.  Read data from | 
 | 904 |         stdout and stderr, until end-of-file is reached.  Wait for | 
| Gregory P. Smith | a454ef6 | 2011-05-22 22:29:49 -0700 | [diff] [blame] | 905 |         process to terminate.  The optional input argument should be | 
 | 906 |         bytes to be sent to the child process, or None, if no data | 
| Peter Astrand | 23109f0 | 2005-03-03 20:28:59 +0000 | [diff] [blame] | 907 |         should be sent to the child. | 
| Tim Peters | eba28be | 2005-03-28 01:08:02 +0000 | [diff] [blame] | 908 |  | 
| Peter Astrand | 23109f0 | 2005-03-03 20:28:59 +0000 | [diff] [blame] | 909 |         communicate() returns a tuple (stdout, stderr).""" | 
 | 910 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 911 |         if self._communication_started and input: | 
 | 912 |             raise ValueError("Cannot send input after starting communication") | 
 | 913 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 914 |         # Optimization: If we are not worried about timeouts, we haven't | 
 | 915 |         # started communicating, and we have one or zero pipes, using select() | 
 | 916 |         # or threads is unnecessary. | 
| Victor Stinner | 7a8d081 | 2011-04-05 13:13:08 +0200 | [diff] [blame] | 917 |         if (timeout is None and not self._communication_started and | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 918 |             [self.stdin, self.stdout, self.stderr].count(None) >= 2): | 
| Tim Peters | eba28be | 2005-03-28 01:08:02 +0000 | [diff] [blame] | 919 |             stdout = None | 
 | 920 |             stderr = None | 
| Peter Astrand | 23109f0 | 2005-03-03 20:28:59 +0000 | [diff] [blame] | 921 |             if self.stdin: | 
 | 922 |                 if input: | 
| Ross Lagerwall | 4f61b02 | 2011-04-05 15:34:00 +0200 | [diff] [blame] | 923 |                     try: | 
 | 924 |                         self.stdin.write(input) | 
| Andrew Svetlov | f7a17b4 | 2012-12-25 16:47:37 +0200 | [diff] [blame] | 925 |                     except OSError as e: | 
| Ross Lagerwall | 4f61b02 | 2011-04-05 15:34:00 +0200 | [diff] [blame] | 926 |                         if e.errno != errno.EPIPE and e.errno != errno.EINVAL: | 
 | 927 |                             raise | 
| Peter Astrand | 23109f0 | 2005-03-03 20:28:59 +0000 | [diff] [blame] | 928 |                 self.stdin.close() | 
 | 929 |             elif self.stdout: | 
| Victor Stinner | 2cfb6f3 | 2011-07-05 14:00:56 +0200 | [diff] [blame] | 930 |                 stdout = _eintr_retry_call(self.stdout.read) | 
| Georg Brandl | f08a9dd | 2008-06-10 16:57:31 +0000 | [diff] [blame] | 931 |                 self.stdout.close() | 
| Peter Astrand | 23109f0 | 2005-03-03 20:28:59 +0000 | [diff] [blame] | 932 |             elif self.stderr: | 
| Victor Stinner | 2cfb6f3 | 2011-07-05 14:00:56 +0200 | [diff] [blame] | 933 |                 stderr = _eintr_retry_call(self.stderr.read) | 
| Georg Brandl | f08a9dd | 2008-06-10 16:57:31 +0000 | [diff] [blame] | 934 |                 self.stderr.close() | 
| Peter Astrand | 23109f0 | 2005-03-03 20:28:59 +0000 | [diff] [blame] | 935 |             self.wait() | 
| Victor Stinner | 7a8d081 | 2011-04-05 13:13:08 +0200 | [diff] [blame] | 936 |         else: | 
 | 937 |             if timeout is not None: | 
| Victor Stinner | 949d8c9 | 2012-05-30 13:30:32 +0200 | [diff] [blame] | 938 |                 endtime = _time() + timeout | 
| Victor Stinner | 7a8d081 | 2011-04-05 13:13:08 +0200 | [diff] [blame] | 939 |             else: | 
 | 940 |                 endtime = None | 
| Tim Peters | eba28be | 2005-03-28 01:08:02 +0000 | [diff] [blame] | 941 |  | 
| Victor Stinner | 7a8d081 | 2011-04-05 13:13:08 +0200 | [diff] [blame] | 942 |             try: | 
 | 943 |                 stdout, stderr = self._communicate(input, endtime, timeout) | 
 | 944 |             finally: | 
 | 945 |                 self._communication_started = True | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 946 |  | 
| Victor Stinner | 7a8d081 | 2011-04-05 13:13:08 +0200 | [diff] [blame] | 947 |             sts = self.wait(timeout=self._remaining_time(endtime)) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 948 |  | 
 | 949 |         return (stdout, stderr) | 
| Peter Astrand | 23109f0 | 2005-03-03 20:28:59 +0000 | [diff] [blame] | 950 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 951 |  | 
| Georg Brandl | 6aa2d1f | 2008-08-12 08:35:52 +0000 | [diff] [blame] | 952 |     def poll(self): | 
 | 953 |         return self._internal_poll() | 
 | 954 |  | 
 | 955 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 956 |     def _remaining_time(self, endtime): | 
 | 957 |         """Convenience for _communicate when computing timeouts.""" | 
 | 958 |         if endtime is None: | 
 | 959 |             return None | 
 | 960 |         else: | 
| Victor Stinner | 949d8c9 | 2012-05-30 13:30:32 +0200 | [diff] [blame] | 961 |             return endtime - _time() | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 962 |  | 
 | 963 |  | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 964 |     def _check_timeout(self, endtime, orig_timeout): | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 965 |         """Convenience for checking if a timeout has expired.""" | 
 | 966 |         if endtime is None: | 
 | 967 |             return | 
| Victor Stinner | 949d8c9 | 2012-05-30 13:30:32 +0200 | [diff] [blame] | 968 |         if _time() > endtime: | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 969 |             raise TimeoutExpired(self.args, orig_timeout) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 970 |  | 
 | 971 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 972 |     if mswindows: | 
 | 973 |         # | 
 | 974 |         # Windows methods | 
 | 975 |         # | 
 | 976 |         def _get_handles(self, stdin, stdout, stderr): | 
| Alexandre Vassalotti | 711ed4a | 2009-07-17 10:42:05 +0000 | [diff] [blame] | 977 |             """Construct and return tuple with IO objects: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 978 |             p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite | 
 | 979 |             """ | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 980 |             if stdin is None and stdout is None and stderr is None: | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 981 |                 return (-1, -1, -1, -1, -1, -1) | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 982 |  | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 983 |             p2cread, p2cwrite = -1, -1 | 
 | 984 |             c2pread, c2pwrite = -1, -1 | 
 | 985 |             errread, errwrite = -1, -1 | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 986 |  | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 987 |             if stdin is None: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 988 |                 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE) | 
| Hirokazu Yamamoto | 0c98817 | 2009-03-03 22:41:26 +0000 | [diff] [blame] | 989 |                 if p2cread is None: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 990 |                     p2cread, _ = _winapi.CreatePipe(None, 0) | 
 | 991 |                     p2cread = Handle(p2cread) | 
 | 992 |                     _winapi.CloseHandle(_) | 
| Hirokazu Yamamoto | 0c98817 | 2009-03-03 22:41:26 +0000 | [diff] [blame] | 993 |             elif stdin == PIPE: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 994 |                 p2cread, p2cwrite = _winapi.CreatePipe(None, 0) | 
 | 995 |                 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite) | 
| Ross Lagerwall | ba102ec | 2011-03-16 18:40:25 +0200 | [diff] [blame] | 996 |             elif stdin == DEVNULL: | 
 | 997 |                 p2cread = msvcrt.get_osfhandle(self._get_devnull()) | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 998 |             elif isinstance(stdin, int): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 999 |                 p2cread = msvcrt.get_osfhandle(stdin) | 
 | 1000 |             else: | 
 | 1001 |                 # Assuming file-like object | 
 | 1002 |                 p2cread = msvcrt.get_osfhandle(stdin.fileno()) | 
 | 1003 |             p2cread = self._make_inheritable(p2cread) | 
 | 1004 |  | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1005 |             if stdout is None: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1006 |                 c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE) | 
| Hirokazu Yamamoto | 0c98817 | 2009-03-03 22:41:26 +0000 | [diff] [blame] | 1007 |                 if c2pwrite is None: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1008 |                     _, c2pwrite = _winapi.CreatePipe(None, 0) | 
 | 1009 |                     c2pwrite = Handle(c2pwrite) | 
 | 1010 |                     _winapi.CloseHandle(_) | 
| Hirokazu Yamamoto | 0c98817 | 2009-03-03 22:41:26 +0000 | [diff] [blame] | 1011 |             elif stdout == PIPE: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1012 |                 c2pread, c2pwrite = _winapi.CreatePipe(None, 0) | 
 | 1013 |                 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite) | 
| Ross Lagerwall | ba102ec | 2011-03-16 18:40:25 +0200 | [diff] [blame] | 1014 |             elif stdout == DEVNULL: | 
 | 1015 |                 c2pwrite = msvcrt.get_osfhandle(self._get_devnull()) | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1016 |             elif isinstance(stdout, int): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1017 |                 c2pwrite = msvcrt.get_osfhandle(stdout) | 
 | 1018 |             else: | 
 | 1019 |                 # Assuming file-like object | 
 | 1020 |                 c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) | 
 | 1021 |             c2pwrite = self._make_inheritable(c2pwrite) | 
 | 1022 |  | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1023 |             if stderr is None: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1024 |                 errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE) | 
| Hirokazu Yamamoto | 0c98817 | 2009-03-03 22:41:26 +0000 | [diff] [blame] | 1025 |                 if errwrite is None: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1026 |                     _, errwrite = _winapi.CreatePipe(None, 0) | 
 | 1027 |                     errwrite = Handle(errwrite) | 
 | 1028 |                     _winapi.CloseHandle(_) | 
| Hirokazu Yamamoto | 0c98817 | 2009-03-03 22:41:26 +0000 | [diff] [blame] | 1029 |             elif stderr == PIPE: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1030 |                 errread, errwrite = _winapi.CreatePipe(None, 0) | 
 | 1031 |                 errread, errwrite = Handle(errread), Handle(errwrite) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1032 |             elif stderr == STDOUT: | 
 | 1033 |                 errwrite = c2pwrite | 
| Ross Lagerwall | ba102ec | 2011-03-16 18:40:25 +0200 | [diff] [blame] | 1034 |             elif stderr == DEVNULL: | 
 | 1035 |                 errwrite = msvcrt.get_osfhandle(self._get_devnull()) | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1036 |             elif isinstance(stderr, int): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1037 |                 errwrite = msvcrt.get_osfhandle(stderr) | 
 | 1038 |             else: | 
 | 1039 |                 # Assuming file-like object | 
 | 1040 |                 errwrite = msvcrt.get_osfhandle(stderr.fileno()) | 
 | 1041 |             errwrite = self._make_inheritable(errwrite) | 
 | 1042 |  | 
 | 1043 |             return (p2cread, p2cwrite, | 
 | 1044 |                     c2pread, c2pwrite, | 
 | 1045 |                     errread, errwrite) | 
 | 1046 |  | 
 | 1047 |  | 
 | 1048 |         def _make_inheritable(self, handle): | 
 | 1049 |             """Return a duplicate of handle, which is inheritable""" | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1050 |             h = _winapi.DuplicateHandle( | 
 | 1051 |                 _winapi.GetCurrentProcess(), handle, | 
 | 1052 |                 _winapi.GetCurrentProcess(), 0, 1, | 
 | 1053 |                 _winapi.DUPLICATE_SAME_ACCESS) | 
 | 1054 |             return Handle(h) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1055 |  | 
 | 1056 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1057 |         def _execute_child(self, args, executable, preexec_fn, close_fds, | 
| Andrew Svetlov | 592df20 | 2012-08-15 17:36:15 +0300 | [diff] [blame] | 1058 |                            pass_fds, cwd, env, | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1059 |                            startupinfo, creationflags, shell, | 
 | 1060 |                            p2cread, p2cwrite, | 
 | 1061 |                            c2pread, c2pwrite, | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1062 |                            errread, errwrite, | 
 | 1063 |                            unused_restore_signals, unused_start_new_session): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1064 |             """Execute program (MS Windows version)""" | 
 | 1065 |  | 
| Gregory P. Smith | 8edd99d | 2010-12-14 13:43:30 +0000 | [diff] [blame] | 1066 |             assert not pass_fds, "pass_fds not supported on Windows." | 
| Gregory P. Smith | d4cc7bf | 2010-12-04 11:22:11 +0000 | [diff] [blame] | 1067 |  | 
| Guido van Rossum | 3172c5d | 2007-10-16 18:12:55 +0000 | [diff] [blame] | 1068 |             if not isinstance(args, str): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1069 |                 args = list2cmdline(args) | 
 | 1070 |  | 
| Peter Astrand | c1d6536 | 2004-11-07 14:30:34 +0000 | [diff] [blame] | 1071 |             # Process startup details | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1072 |             if startupinfo is None: | 
| Thomas Wouters | 73e5a5b | 2006-06-08 15:35:45 +0000 | [diff] [blame] | 1073 |                 startupinfo = STARTUPINFO() | 
| Victor Stinner | b369358 | 2010-05-21 20:13:12 +0000 | [diff] [blame] | 1074 |             if -1 not in (p2cread, c2pwrite, errwrite): | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1075 |                 startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES | 
| Peter Astrand | c1d6536 | 2004-11-07 14:30:34 +0000 | [diff] [blame] | 1076 |                 startupinfo.hStdInput = p2cread | 
 | 1077 |                 startupinfo.hStdOutput = c2pwrite | 
 | 1078 |                 startupinfo.hStdError = errwrite | 
 | 1079 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1080 |             if shell: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1081 |                 startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW | 
 | 1082 |                 startupinfo.wShowWindow = _winapi.SW_HIDE | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1083 |                 comspec = os.environ.get("COMSPEC", "cmd.exe") | 
| Tim Golden | 126c296 | 2010-08-11 14:20:40 +0000 | [diff] [blame] | 1084 |                 args = '{} /c "{}"'.format (comspec, args) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1085 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1086 |             # Start the process | 
 | 1087 |             try: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1088 |                 hp, ht, pid, tid = _winapi.CreateProcess(executable, args, | 
| Tim Peters | e8374a5 | 2004-10-13 03:15:00 +0000 | [diff] [blame] | 1089 |                                          # no special security | 
 | 1090 |                                          None, None, | 
| Guido van Rossum | e7ba495 | 2007-06-06 23:52:48 +0000 | [diff] [blame] | 1091 |                                          int(not close_fds), | 
| Tim Peters | e8374a5 | 2004-10-13 03:15:00 +0000 | [diff] [blame] | 1092 |                                          creationflags, | 
 | 1093 |                                          env, | 
 | 1094 |                                          cwd, | 
 | 1095 |                                          startupinfo) | 
| Tim Golden | ad537f2 | 2010-08-08 11:18:16 +0000 | [diff] [blame] | 1096 |             finally: | 
 | 1097 |                 # Child is launched. Close the parent's copy of those pipe | 
 | 1098 |                 # handles that only the child should have open.  You need | 
 | 1099 |                 # to make sure that no handles to the write end of the | 
 | 1100 |                 # output pipe are maintained in this process or else the | 
 | 1101 |                 # pipe will not close when the child process exits and the | 
 | 1102 |                 # ReadFile will hang. | 
 | 1103 |                 if p2cread != -1: | 
 | 1104 |                     p2cread.Close() | 
 | 1105 |                 if c2pwrite != -1: | 
 | 1106 |                     c2pwrite.Close() | 
 | 1107 |                 if errwrite != -1: | 
 | 1108 |                     errwrite.Close() | 
| Ross Lagerwall | ba102ec | 2011-03-16 18:40:25 +0200 | [diff] [blame] | 1109 |                 if hasattr(self, '_devnull'): | 
 | 1110 |                     os.close(self._devnull) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1111 |  | 
 | 1112 |             # Retain the process handle, but close the thread handle | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 1113 |             self._child_created = True | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1114 |             self._handle = Handle(hp) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1115 |             self.pid = pid | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1116 |             _winapi.CloseHandle(ht) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1117 |  | 
| Brett Cannon | 84df1e6 | 2010-05-14 00:33:40 +0000 | [diff] [blame] | 1118 |         def _internal_poll(self, _deadstate=None, | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1119 |                 _WaitForSingleObject=_winapi.WaitForSingleObject, | 
 | 1120 |                 _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0, | 
 | 1121 |                 _GetExitCodeProcess=_winapi.GetExitCodeProcess): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1122 |             """Check if child process has terminated.  Returns returncode | 
| Brett Cannon | 84df1e6 | 2010-05-14 00:33:40 +0000 | [diff] [blame] | 1123 |             attribute. | 
 | 1124 |  | 
 | 1125 |             This method is called by __del__, so it can only refer to objects | 
 | 1126 |             in its local scope. | 
 | 1127 |  | 
 | 1128 |             """ | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1129 |             if self.returncode is None: | 
| Brett Cannon | 84df1e6 | 2010-05-14 00:33:40 +0000 | [diff] [blame] | 1130 |                 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0: | 
 | 1131 |                     self.returncode = _GetExitCodeProcess(self._handle) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1132 |             return self.returncode | 
 | 1133 |  | 
 | 1134 |  | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1135 |         def wait(self, timeout=None, endtime=None): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1136 |             """Wait for child process to terminate.  Returns returncode | 
 | 1137 |             attribute.""" | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1138 |             if endtime is not None: | 
 | 1139 |                 timeout = self._remaining_time(endtime) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1140 |             if timeout is None: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1141 |                 timeout_millis = _winapi.INFINITE | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1142 |             else: | 
| Reid Kleckner | 91156ff | 2011-03-21 10:06:10 -0700 | [diff] [blame] | 1143 |                 timeout_millis = int(timeout * 1000) | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1144 |             if self.returncode is None: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1145 |                 result = _winapi.WaitForSingleObject(self._handle, | 
 | 1146 |                                                     timeout_millis) | 
 | 1147 |                 if result == _winapi.WAIT_TIMEOUT: | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1148 |                     raise TimeoutExpired(self.args, timeout) | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1149 |                 self.returncode = _winapi.GetExitCodeProcess(self._handle) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1150 |             return self.returncode | 
 | 1151 |  | 
 | 1152 |  | 
 | 1153 |         def _readerthread(self, fh, buffer): | 
 | 1154 |             buffer.append(fh.read()) | 
| Victor Stinner | 667d4b5 | 2010-12-25 22:40:32 +0000 | [diff] [blame] | 1155 |             fh.close() | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1156 |  | 
 | 1157 |  | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1158 |         def _communicate(self, input, endtime, orig_timeout): | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1159 |             # Start reader threads feeding into a list hanging off of this | 
 | 1160 |             # object, unless they've already been started. | 
 | 1161 |             if self.stdout and not hasattr(self, "_stdout_buff"): | 
 | 1162 |                 self._stdout_buff = [] | 
 | 1163 |                 self.stdout_thread = \ | 
 | 1164 |                         threading.Thread(target=self._readerthread, | 
 | 1165 |                                          args=(self.stdout, self._stdout_buff)) | 
 | 1166 |                 self.stdout_thread.daemon = True | 
 | 1167 |                 self.stdout_thread.start() | 
 | 1168 |             if self.stderr and not hasattr(self, "_stderr_buff"): | 
 | 1169 |                 self._stderr_buff = [] | 
 | 1170 |                 self.stderr_thread = \ | 
 | 1171 |                         threading.Thread(target=self._readerthread, | 
 | 1172 |                                          args=(self.stderr, self._stderr_buff)) | 
 | 1173 |                 self.stderr_thread.daemon = True | 
 | 1174 |                 self.stderr_thread.start() | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1175 |  | 
 | 1176 |             if self.stdin: | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1177 |                 if input is not None: | 
| Ross Lagerwall | 4f61b02 | 2011-04-05 15:34:00 +0200 | [diff] [blame] | 1178 |                     try: | 
 | 1179 |                         self.stdin.write(input) | 
| Andrew Svetlov | f7a17b4 | 2012-12-25 16:47:37 +0200 | [diff] [blame] | 1180 |                     except OSError as e: | 
| Ross Lagerwall | 4f61b02 | 2011-04-05 15:34:00 +0200 | [diff] [blame] | 1181 |                         if e.errno != errno.EPIPE: | 
 | 1182 |                             raise | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1183 |                 self.stdin.close() | 
 | 1184 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1185 |             # Wait for the reader threads, or time out.  If we time out, the | 
 | 1186 |             # threads remain reading and the fds left open in case the user | 
 | 1187 |             # calls communicate again. | 
 | 1188 |             if self.stdout is not None: | 
 | 1189 |                 self.stdout_thread.join(self._remaining_time(endtime)) | 
| Andrew Svetlov | 377a152 | 2012-08-19 20:49:39 +0300 | [diff] [blame] | 1190 |                 if self.stdout_thread.is_alive(): | 
| Reid Kleckner | 9a67e6c | 2011-03-20 08:28:07 -0700 | [diff] [blame] | 1191 |                     raise TimeoutExpired(self.args, orig_timeout) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1192 |             if self.stderr is not None: | 
 | 1193 |                 self.stderr_thread.join(self._remaining_time(endtime)) | 
| Andrew Svetlov | 377a152 | 2012-08-19 20:49:39 +0300 | [diff] [blame] | 1194 |                 if self.stderr_thread.is_alive(): | 
| Reid Kleckner | 9a67e6c | 2011-03-20 08:28:07 -0700 | [diff] [blame] | 1195 |                     raise TimeoutExpired(self.args, orig_timeout) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1196 |  | 
 | 1197 |             # Collect the output from and close both pipes, now that we know | 
 | 1198 |             # both have been read successfully. | 
 | 1199 |             stdout = None | 
 | 1200 |             stderr = None | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1201 |             if self.stdout: | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1202 |                 stdout = self._stdout_buff | 
 | 1203 |                 self.stdout.close() | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1204 |             if self.stderr: | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1205 |                 stderr = self._stderr_buff | 
 | 1206 |                 self.stderr.close() | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1207 |  | 
 | 1208 |             # All data exchanged.  Translate lists into strings. | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1209 |             if stdout is not None: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1210 |                 stdout = stdout[0] | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1211 |             if stderr is not None: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1212 |                 stderr = stderr[0] | 
 | 1213 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1214 |             return (stdout, stderr) | 
 | 1215 |  | 
| Christian Heimes | a342c01 | 2008-04-20 21:01:16 +0000 | [diff] [blame] | 1216 |         def send_signal(self, sig): | 
 | 1217 |             """Send a signal to the process | 
 | 1218 |             """ | 
 | 1219 |             if sig == signal.SIGTERM: | 
 | 1220 |                 self.terminate() | 
| Brian Curtin | eb24d74 | 2010-04-12 17:16:38 +0000 | [diff] [blame] | 1221 |             elif sig == signal.CTRL_C_EVENT: | 
 | 1222 |                 os.kill(self.pid, signal.CTRL_C_EVENT) | 
 | 1223 |             elif sig == signal.CTRL_BREAK_EVENT: | 
 | 1224 |                 os.kill(self.pid, signal.CTRL_BREAK_EVENT) | 
| Christian Heimes | a342c01 | 2008-04-20 21:01:16 +0000 | [diff] [blame] | 1225 |             else: | 
| Brian Curtin | 1965136 | 2010-09-07 13:24:38 +0000 | [diff] [blame] | 1226 |                 raise ValueError("Unsupported signal: {}".format(sig)) | 
| Christian Heimes | a342c01 | 2008-04-20 21:01:16 +0000 | [diff] [blame] | 1227 |  | 
 | 1228 |         def terminate(self): | 
 | 1229 |             """Terminates the process | 
 | 1230 |             """ | 
| Antoine Pitrou | 1f9a835 | 2012-03-11 19:29:12 +0100 | [diff] [blame] | 1231 |             try: | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1232 |                 _winapi.TerminateProcess(self._handle, 1) | 
| Antoine Pitrou | b69ef16 | 2012-03-11 19:33:29 +0100 | [diff] [blame] | 1233 |             except PermissionError: | 
| Antoine Pitrou | 1f9a835 | 2012-03-11 19:29:12 +0100 | [diff] [blame] | 1234 |                 # ERROR_ACCESS_DENIED (winerror 5) is received when the | 
 | 1235 |                 # process already died. | 
| Antoine Pitrou | 23bba4c | 2012-04-18 20:51:15 +0200 | [diff] [blame] | 1236 |                 rc = _winapi.GetExitCodeProcess(self._handle) | 
 | 1237 |                 if rc == _winapi.STILL_ACTIVE: | 
| Antoine Pitrou | 1f9a835 | 2012-03-11 19:29:12 +0100 | [diff] [blame] | 1238 |                     raise | 
 | 1239 |                 self.returncode = rc | 
| Christian Heimes | a342c01 | 2008-04-20 21:01:16 +0000 | [diff] [blame] | 1240 |  | 
 | 1241 |         kill = terminate | 
 | 1242 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1243 |     else: | 
 | 1244 |         # | 
 | 1245 |         # POSIX methods | 
 | 1246 |         # | 
 | 1247 |         def _get_handles(self, stdin, stdout, stderr): | 
| Alexandre Vassalotti | 711ed4a | 2009-07-17 10:42:05 +0000 | [diff] [blame] | 1248 |             """Construct and return tuple with IO objects: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1249 |             p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite | 
 | 1250 |             """ | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1251 |             p2cread, p2cwrite = -1, -1 | 
 | 1252 |             c2pread, c2pwrite = -1, -1 | 
 | 1253 |             errread, errwrite = -1, -1 | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1254 |  | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1255 |             if stdin is None: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1256 |                 pass | 
 | 1257 |             elif stdin == PIPE: | 
| Gregory P. Smith | 51ee270 | 2010-12-13 07:59:39 +0000 | [diff] [blame] | 1258 |                 p2cread, p2cwrite = _create_pipe() | 
| Ross Lagerwall | ba102ec | 2011-03-16 18:40:25 +0200 | [diff] [blame] | 1259 |             elif stdin == DEVNULL: | 
 | 1260 |                 p2cread = self._get_devnull() | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1261 |             elif isinstance(stdin, int): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1262 |                 p2cread = stdin | 
 | 1263 |             else: | 
 | 1264 |                 # Assuming file-like object | 
 | 1265 |                 p2cread = stdin.fileno() | 
 | 1266 |  | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1267 |             if stdout is None: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1268 |                 pass | 
 | 1269 |             elif stdout == PIPE: | 
| Gregory P. Smith | 51ee270 | 2010-12-13 07:59:39 +0000 | [diff] [blame] | 1270 |                 c2pread, c2pwrite = _create_pipe() | 
| Ross Lagerwall | ba102ec | 2011-03-16 18:40:25 +0200 | [diff] [blame] | 1271 |             elif stdout == DEVNULL: | 
 | 1272 |                 c2pwrite = self._get_devnull() | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1273 |             elif isinstance(stdout, int): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1274 |                 c2pwrite = stdout | 
 | 1275 |             else: | 
 | 1276 |                 # Assuming file-like object | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 1277 |                 c2pwrite = stdout.fileno() | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1278 |  | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1279 |             if stderr is None: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1280 |                 pass | 
 | 1281 |             elif stderr == PIPE: | 
| Gregory P. Smith | 51ee270 | 2010-12-13 07:59:39 +0000 | [diff] [blame] | 1282 |                 errread, errwrite = _create_pipe() | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1283 |             elif stderr == STDOUT: | 
 | 1284 |                 errwrite = c2pwrite | 
| Ross Lagerwall | ba102ec | 2011-03-16 18:40:25 +0200 | [diff] [blame] | 1285 |             elif stderr == DEVNULL: | 
 | 1286 |                 errwrite = self._get_devnull() | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1287 |             elif isinstance(stderr, int): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1288 |                 errwrite = stderr | 
 | 1289 |             else: | 
 | 1290 |                 # Assuming file-like object | 
 | 1291 |                 errwrite = stderr.fileno() | 
 | 1292 |  | 
 | 1293 |             return (p2cread, p2cwrite, | 
 | 1294 |                     c2pread, c2pwrite, | 
 | 1295 |                     errread, errwrite) | 
 | 1296 |  | 
 | 1297 |  | 
| Antoine Pitrou | 47f14ba | 2011-01-03 23:42:01 +0000 | [diff] [blame] | 1298 |         def _close_fds(self, fds_to_keep): | 
| Gregory P. Smith | d4cc7bf | 2010-12-04 11:22:11 +0000 | [diff] [blame] | 1299 |             start_fd = 3 | 
| Antoine Pitrou | 47f14ba | 2011-01-03 23:42:01 +0000 | [diff] [blame] | 1300 |             for fd in sorted(fds_to_keep): | 
| Gregory P. Smith | 8edd99d | 2010-12-14 13:43:30 +0000 | [diff] [blame] | 1301 |                 if fd >= start_fd: | 
| Gregory P. Smith | d4cc7bf | 2010-12-04 11:22:11 +0000 | [diff] [blame] | 1302 |                     os.closerange(start_fd, fd) | 
 | 1303 |                     start_fd = fd + 1 | 
 | 1304 |             if start_fd <= MAXFD: | 
 | 1305 |                 os.closerange(start_fd, MAXFD) | 
 | 1306 |  | 
 | 1307 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1308 |         def _execute_child(self, args, executable, preexec_fn, close_fds, | 
| Andrew Svetlov | 592df20 | 2012-08-15 17:36:15 +0300 | [diff] [blame] | 1309 |                            pass_fds, cwd, env, | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1310 |                            startupinfo, creationflags, shell, | 
 | 1311 |                            p2cread, p2cwrite, | 
 | 1312 |                            c2pread, c2pwrite, | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1313 |                            errread, errwrite, | 
 | 1314 |                            restore_signals, start_new_session): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1315 |             """Execute program (POSIX version)""" | 
 | 1316 |  | 
| Victor Stinner | 7b3b20a | 2011-03-03 12:54:05 +0000 | [diff] [blame] | 1317 |             if isinstance(args, (str, bytes)): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1318 |                 args = [args] | 
| Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 1319 |             else: | 
 | 1320 |                 args = list(args) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1321 |  | 
 | 1322 |             if shell: | 
 | 1323 |                 args = ["/bin/sh", "-c"] + args | 
| Stefan Krah | 9542cc6 | 2010-07-19 14:20:53 +0000 | [diff] [blame] | 1324 |                 if executable: | 
 | 1325 |                     args[0] = executable | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1326 |  | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1327 |             if executable is None: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1328 |                 executable = args[0] | 
| Gregory P. Smith | 5591b02 | 2012-10-10 03:34:47 -0700 | [diff] [blame] | 1329 |             orig_executable = executable | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1330 |  | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1331 |             # For transferring possible exec failure from child to parent. | 
 | 1332 |             # Data format: "exception name:hex errno:description" | 
 | 1333 |             # Pickle is not used; it is complex and involves memory allocation. | 
| Gregory P. Smith | 51ee270 | 2010-12-13 07:59:39 +0000 | [diff] [blame] | 1334 |             errpipe_read, errpipe_write = _create_pipe() | 
| Christian Heimes | fdab48e | 2008-01-20 09:06:41 +0000 | [diff] [blame] | 1335 |             try: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1336 |                 try: | 
| Gregory P. Smith | 59fd1bf | 2011-05-28 09:32:39 -0700 | [diff] [blame] | 1337 |                     # We must avoid complex work that could involve | 
 | 1338 |                     # malloc or free in the child process to avoid | 
 | 1339 |                     # potential deadlocks, thus we do all this here. | 
 | 1340 |                     # and pass it to fork_exec() | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1341 |  | 
| Victor Stinner | 372b838 | 2011-06-21 17:24:21 +0200 | [diff] [blame] | 1342 |                     if env is not None: | 
| Gregory P. Smith | 59fd1bf | 2011-05-28 09:32:39 -0700 | [diff] [blame] | 1343 |                         env_list = [os.fsencode(k) + b'=' + os.fsencode(v) | 
 | 1344 |                                     for k, v in env.items()] | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1345 |                     else: | 
| Gregory P. Smith | 59fd1bf | 2011-05-28 09:32:39 -0700 | [diff] [blame] | 1346 |                         env_list = None  # Use execv instead of execve. | 
 | 1347 |                     executable = os.fsencode(executable) | 
 | 1348 |                     if os.path.dirname(executable): | 
 | 1349 |                         executable_list = (executable,) | 
 | 1350 |                     else: | 
 | 1351 |                         # This matches the behavior of os._execvpe(). | 
 | 1352 |                         executable_list = tuple( | 
 | 1353 |                             os.path.join(os.fsencode(dir), executable) | 
 | 1354 |                             for dir in os.get_exec_path(env)) | 
 | 1355 |                     fds_to_keep = set(pass_fds) | 
 | 1356 |                     fds_to_keep.add(errpipe_write) | 
 | 1357 |                     self.pid = _posixsubprocess.fork_exec( | 
 | 1358 |                             args, executable_list, | 
 | 1359 |                             close_fds, sorted(fds_to_keep), cwd, env_list, | 
 | 1360 |                             p2cread, p2cwrite, c2pread, c2pwrite, | 
 | 1361 |                             errread, errwrite, | 
 | 1362 |                             errpipe_read, errpipe_write, | 
 | 1363 |                             restore_signals, start_new_session, preexec_fn) | 
| Charles-François Natali | 558639f | 2011-08-18 19:11:29 +0200 | [diff] [blame] | 1364 |                     self._child_created = True | 
| Facundo Batista | 10706e2 | 2009-06-19 20:34:30 +0000 | [diff] [blame] | 1365 |                 finally: | 
 | 1366 |                     # be sure the FD is closed no matter what | 
 | 1367 |                     os.close(errpipe_write) | 
 | 1368 |  | 
| Gregory P. Smith | b5461b9 | 2013-06-15 18:04:26 -0700 | [diff] [blame] | 1369 |                 # self._devnull is not always defined. | 
 | 1370 |                 devnull_fd = getattr(self, '_devnull', None) | 
 | 1371 |                 if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd: | 
| Facundo Batista | 10706e2 | 2009-06-19 20:34:30 +0000 | [diff] [blame] | 1372 |                     os.close(p2cread) | 
| Gregory P. Smith | b5461b9 | 2013-06-15 18:04:26 -0700 | [diff] [blame] | 1373 |                 if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd: | 
| Facundo Batista | 10706e2 | 2009-06-19 20:34:30 +0000 | [diff] [blame] | 1374 |                     os.close(c2pwrite) | 
| Gregory P. Smith | b5461b9 | 2013-06-15 18:04:26 -0700 | [diff] [blame] | 1375 |                 if errwrite != -1 and errread != -1 and errwrite != devnull_fd: | 
| Facundo Batista | 10706e2 | 2009-06-19 20:34:30 +0000 | [diff] [blame] | 1376 |                     os.close(errwrite) | 
| Gregory P. Smith | b5461b9 | 2013-06-15 18:04:26 -0700 | [diff] [blame] | 1377 |                 if devnull_fd is not None: | 
 | 1378 |                     os.close(devnull_fd) | 
 | 1379 |                 # Prevent a double close of these fds from __init__ on error. | 
 | 1380 |                 self._closed_child_pipe_fds = True | 
| Facundo Batista | 10706e2 | 2009-06-19 20:34:30 +0000 | [diff] [blame] | 1381 |  | 
 | 1382 |                 # Wait for exec to fail or succeed; possibly raising an | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1383 |                 # exception (limited in size) | 
| Gregory P. Smith | f44c9da | 2012-11-10 23:33:17 -0800 | [diff] [blame] | 1384 |                 errpipe_data = bytearray() | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1385 |                 while True: | 
 | 1386 |                     part = _eintr_retry_call(os.read, errpipe_read, 50000) | 
| Gregory P. Smith | f44c9da | 2012-11-10 23:33:17 -0800 | [diff] [blame] | 1387 |                     errpipe_data += part | 
 | 1388 |                     if not part or len(errpipe_data) > 50000: | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1389 |                         break | 
| Facundo Batista | 10706e2 | 2009-06-19 20:34:30 +0000 | [diff] [blame] | 1390 |             finally: | 
 | 1391 |                 # be sure the FD is closed no matter what | 
 | 1392 |                 os.close(errpipe_read) | 
 | 1393 |  | 
| Gregory P. Smith | f44c9da | 2012-11-10 23:33:17 -0800 | [diff] [blame] | 1394 |             if errpipe_data: | 
| Gregory P. Smith | e85db2b | 2010-12-14 14:38:00 +0000 | [diff] [blame] | 1395 |                 try: | 
 | 1396 |                     _eintr_retry_call(os.waitpid, self.pid, 0) | 
 | 1397 |                 except OSError as e: | 
 | 1398 |                     if e.errno != errno.ECHILD: | 
 | 1399 |                         raise | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1400 |                 try: | 
| Gregory P. Smith | f44c9da | 2012-11-10 23:33:17 -0800 | [diff] [blame] | 1401 |                     exception_name, hex_errno, err_msg = ( | 
 | 1402 |                             errpipe_data.split(b':', 2)) | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1403 |                 except ValueError: | 
| Gregory P. Smith | 8d07c26 | 2012-11-10 23:53:47 -0800 | [diff] [blame] | 1404 |                     exception_name = b'SubprocessError' | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1405 |                     hex_errno = b'0' | 
| Gregory P. Smith | 3aee222 | 2012-11-11 00:04:13 -0800 | [diff] [blame] | 1406 |                     err_msg = (b'Bad exception data from child: ' + | 
 | 1407 |                                repr(errpipe_data)) | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1408 |                 child_exception_type = getattr( | 
 | 1409 |                         builtins, exception_name.decode('ascii'), | 
| Gregory P. Smith | 8d07c26 | 2012-11-10 23:53:47 -0800 | [diff] [blame] | 1410 |                         SubprocessError) | 
| Victor Stinner | 4d07804 | 2010-04-23 19:28:32 +0000 | [diff] [blame] | 1411 |                 err_msg = err_msg.decode(errors="surrogatepass") | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1412 |                 if issubclass(child_exception_type, OSError) and hex_errno: | 
| Benjamin Peterson | b8bc439 | 2010-11-20 18:24:54 +0000 | [diff] [blame] | 1413 |                     errno_num = int(hex_errno, 16) | 
| Gregory P. Smith | 5591b02 | 2012-10-10 03:34:47 -0700 | [diff] [blame] | 1414 |                     child_exec_never_called = (err_msg == "noexec") | 
 | 1415 |                     if child_exec_never_called: | 
 | 1416 |                         err_msg = "" | 
| Benjamin Peterson | b8bc439 | 2010-11-20 18:24:54 +0000 | [diff] [blame] | 1417 |                     if errno_num != 0: | 
 | 1418 |                         err_msg = os.strerror(errno_num) | 
 | 1419 |                         if errno_num == errno.ENOENT: | 
| Gregory P. Smith | 5591b02 | 2012-10-10 03:34:47 -0700 | [diff] [blame] | 1420 |                             if child_exec_never_called: | 
 | 1421 |                                 # The error must be from chdir(cwd). | 
 | 1422 |                                 err_msg += ': ' + repr(cwd) | 
 | 1423 |                             else: | 
 | 1424 |                                 err_msg += ': ' + repr(orig_executable) | 
| Benjamin Peterson | b8bc439 | 2010-11-20 18:24:54 +0000 | [diff] [blame] | 1425 |                     raise child_exception_type(errno_num, err_msg) | 
| Gregory P. Smith | fb94c5f | 2010-03-14 06:49:55 +0000 | [diff] [blame] | 1426 |                 raise child_exception_type(err_msg) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1427 |  | 
 | 1428 |  | 
| Brett Cannon | 84df1e6 | 2010-05-14 00:33:40 +0000 | [diff] [blame] | 1429 |         def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED, | 
 | 1430 |                 _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED, | 
 | 1431 |                 _WEXITSTATUS=os.WEXITSTATUS): | 
 | 1432 |             # This method is called (indirectly) by __del__, so it cannot | 
 | 1433 |             # refer to anything outside of its local scope.""" | 
 | 1434 |             if _WIFSIGNALED(sts): | 
 | 1435 |                 self.returncode = -_WTERMSIG(sts) | 
 | 1436 |             elif _WIFEXITED(sts): | 
 | 1437 |                 self.returncode = _WEXITSTATUS(sts) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1438 |             else: | 
 | 1439 |                 # Should never happen | 
| Gregory P. Smith | 8d07c26 | 2012-11-10 23:53:47 -0800 | [diff] [blame] | 1440 |                 raise SubprocessError("Unknown child exit status!") | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1441 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1442 |  | 
| Brett Cannon | 84df1e6 | 2010-05-14 00:33:40 +0000 | [diff] [blame] | 1443 |         def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, | 
| Andrew Svetlov | 1d960fe | 2012-12-24 20:08:53 +0200 | [diff] [blame] | 1444 |                 _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1445 |             """Check if child process has terminated.  Returns returncode | 
| Brett Cannon | 84df1e6 | 2010-05-14 00:33:40 +0000 | [diff] [blame] | 1446 |             attribute. | 
 | 1447 |  | 
 | 1448 |             This method is called by __del__, so it cannot reference anything | 
 | 1449 |             outside of the local scope (nor can any methods it calls). | 
 | 1450 |  | 
 | 1451 |             """ | 
| Peter Astrand | d38ddf4 | 2005-02-10 08:32:50 +0000 | [diff] [blame] | 1452 |             if self.returncode is None: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1453 |                 try: | 
| Brett Cannon | 84df1e6 | 2010-05-14 00:33:40 +0000 | [diff] [blame] | 1454 |                     pid, sts = _waitpid(self.pid, _WNOHANG) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1455 |                     if pid == self.pid: | 
 | 1456 |                         self._handle_exitstatus(sts) | 
| Andrew Svetlov | ad28c7f | 2012-12-18 22:02:39 +0200 | [diff] [blame] | 1457 |                 except OSError as e: | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 1458 |                     if _deadstate is not None: | 
 | 1459 |                         self.returncode = _deadstate | 
| Andrew Svetlov | 08bab07 | 2012-12-24 20:06:35 +0200 | [diff] [blame] | 1460 |                     elif e.errno == _ECHILD: | 
| Gregory P. Smith | 3905171 | 2012-09-29 11:40:38 -0700 | [diff] [blame] | 1461 |                         # This happens if SIGCLD is set to be ignored or | 
 | 1462 |                         # waiting for child processes has otherwise been | 
 | 1463 |                         # disabled for our process.  This child is dead, we | 
 | 1464 |                         # can't get the status. | 
 | 1465 |                         # http://bugs.python.org/issue15756 | 
 | 1466 |                         self.returncode = 0 | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1467 |             return self.returncode | 
 | 1468 |  | 
 | 1469 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1470 |         def _try_wait(self, wait_flags): | 
 | 1471 |             try: | 
 | 1472 |                 (pid, sts) = _eintr_retry_call(os.waitpid, self.pid, wait_flags) | 
 | 1473 |             except OSError as e: | 
 | 1474 |                 if e.errno != errno.ECHILD: | 
 | 1475 |                     raise | 
 | 1476 |                 # This happens if SIGCLD is set to be ignored or waiting | 
 | 1477 |                 # for child processes has otherwise been disabled for our | 
 | 1478 |                 # process.  This child is dead, we can't get the status. | 
 | 1479 |                 pid = self.pid | 
 | 1480 |                 sts = 0 | 
 | 1481 |             return (pid, sts) | 
 | 1482 |  | 
 | 1483 |  | 
 | 1484 |         def wait(self, timeout=None, endtime=None): | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1485 |             """Wait for child process to terminate.  Returns returncode | 
 | 1486 |             attribute.""" | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1487 |             if self.returncode is not None: | 
 | 1488 |                 return self.returncode | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1489 |  | 
 | 1490 |             # endtime is preferred to timeout.  timeout is only used for | 
 | 1491 |             # printing. | 
 | 1492 |             if endtime is not None or timeout is not None: | 
 | 1493 |                 if endtime is None: | 
| Victor Stinner | 949d8c9 | 2012-05-30 13:30:32 +0200 | [diff] [blame] | 1494 |                     endtime = _time() + timeout | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1495 |                 elif timeout is None: | 
 | 1496 |                     timeout = self._remaining_time(endtime) | 
 | 1497 |  | 
 | 1498 |             if endtime is not None: | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1499 |                 # Enter a busy loop if we have a timeout.  This busy loop was | 
 | 1500 |                 # cribbed from Lib/threading.py in Thread.wait() at r71065. | 
 | 1501 |                 delay = 0.0005 # 500 us -> initial delay of 1 ms | 
 | 1502 |                 while True: | 
 | 1503 |                     (pid, sts) = self._try_wait(os.WNOHANG) | 
 | 1504 |                     assert pid == self.pid or pid == 0 | 
 | 1505 |                     if pid == self.pid: | 
 | 1506 |                         self._handle_exitstatus(sts) | 
 | 1507 |                         break | 
 | 1508 |                     remaining = self._remaining_time(endtime) | 
 | 1509 |                     if remaining <= 0: | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1510 |                         raise TimeoutExpired(self.args, timeout) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1511 |                     delay = min(delay * 2, remaining, .05) | 
 | 1512 |                     time.sleep(delay) | 
| Gregory P. Smith | f328d79 | 2012-11-10 21:06:18 -0800 | [diff] [blame] | 1513 |             else: | 
 | 1514 |                 while self.returncode is None: | 
 | 1515 |                     (pid, sts) = self._try_wait(0) | 
 | 1516 |                     # Check the pid and loop as waitpid has been known to return | 
 | 1517 |                     # 0 even without WNOHANG in odd situations.  issue14396. | 
 | 1518 |                     if pid == self.pid: | 
 | 1519 |                         self._handle_exitstatus(sts) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1520 |             return self.returncode | 
 | 1521 |  | 
 | 1522 |  | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1523 |         def _communicate(self, input, endtime, orig_timeout): | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1524 |             if self.stdin and not self._communication_started: | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1525 |                 # Flush stdio buffer.  This might block, if the user has | 
 | 1526 |                 # been writing to .stdin in an uncontrolled fashion. | 
 | 1527 |                 self.stdin.flush() | 
 | 1528 |                 if not input: | 
 | 1529 |                     self.stdin.close() | 
 | 1530 |  | 
 | 1531 |             if _has_poll: | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1532 |                 stdout, stderr = self._communicate_with_poll(input, endtime, | 
 | 1533 |                                                              orig_timeout) | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1534 |             else: | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1535 |                 stdout, stderr = self._communicate_with_select(input, endtime, | 
 | 1536 |                                                                orig_timeout) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1537 |  | 
 | 1538 |             self.wait(timeout=self._remaining_time(endtime)) | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1539 |  | 
 | 1540 |             # All data exchanged.  Translate lists into strings. | 
 | 1541 |             if stdout is not None: | 
 | 1542 |                 stdout = b''.join(stdout) | 
 | 1543 |             if stderr is not None: | 
 | 1544 |                 stderr = b''.join(stderr) | 
 | 1545 |  | 
 | 1546 |             # Translate newlines, if requested. | 
 | 1547 |             # This also turns bytes into strings. | 
 | 1548 |             if self.universal_newlines: | 
 | 1549 |                 if stdout is not None: | 
 | 1550 |                     stdout = self._translate_newlines(stdout, | 
 | 1551 |                                                       self.stdout.encoding) | 
 | 1552 |                 if stderr is not None: | 
 | 1553 |                     stderr = self._translate_newlines(stderr, | 
 | 1554 |                                                       self.stderr.encoding) | 
 | 1555 |  | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1556 |             return (stdout, stderr) | 
 | 1557 |  | 
 | 1558 |  | 
| Andrew Svetlov | aa0dbdc | 2012-08-14 18:40:21 +0300 | [diff] [blame] | 1559 |         def _save_input(self, input): | 
 | 1560 |             # This method is called from the _communicate_with_*() methods | 
 | 1561 |             # so that if we time out while communicating, we can continue | 
 | 1562 |             # sending input if we retry. | 
 | 1563 |             if self.stdin and self._input is None: | 
 | 1564 |                 self._input_offset = 0 | 
 | 1565 |                 self._input = input | 
 | 1566 |                 if self.universal_newlines and input is not None: | 
 | 1567 |                     self._input = self._input.encode(self.stdin.encoding) | 
 | 1568 |  | 
 | 1569 |  | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1570 |         def _communicate_with_poll(self, input, endtime, orig_timeout): | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1571 |             stdout = None # Return | 
 | 1572 |             stderr = None # Return | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1573 |  | 
 | 1574 |             if not self._communication_started: | 
 | 1575 |                 self._fd2file = {} | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1576 |  | 
 | 1577 |             poller = select.poll() | 
 | 1578 |             def register_and_append(file_obj, eventmask): | 
 | 1579 |                 poller.register(file_obj.fileno(), eventmask) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1580 |                 self._fd2file[file_obj.fileno()] = file_obj | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1581 |  | 
 | 1582 |             def close_unregister_and_remove(fd): | 
 | 1583 |                 poller.unregister(fd) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1584 |                 self._fd2file[fd].close() | 
 | 1585 |                 self._fd2file.pop(fd) | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1586 |  | 
 | 1587 |             if self.stdin and input: | 
 | 1588 |                 register_and_append(self.stdin, select.POLLOUT) | 
 | 1589 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1590 |             # Only create this mapping if we haven't already. | 
 | 1591 |             if not self._communication_started: | 
 | 1592 |                 self._fd2output = {} | 
 | 1593 |                 if self.stdout: | 
 | 1594 |                     self._fd2output[self.stdout.fileno()] = [] | 
 | 1595 |                 if self.stderr: | 
 | 1596 |                     self._fd2output[self.stderr.fileno()] = [] | 
 | 1597 |  | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1598 |             select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI | 
 | 1599 |             if self.stdout: | 
 | 1600 |                 register_and_append(self.stdout, select_POLLIN_POLLPRI) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1601 |                 stdout = self._fd2output[self.stdout.fileno()] | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1602 |             if self.stderr: | 
 | 1603 |                 register_and_append(self.stderr, select_POLLIN_POLLPRI) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1604 |                 stderr = self._fd2output[self.stderr.fileno()] | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1605 |  | 
| Andrew Svetlov | aa0dbdc | 2012-08-14 18:40:21 +0300 | [diff] [blame] | 1606 |             self._save_input(input) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1607 |  | 
 | 1608 |             while self._fd2file: | 
| Victor Stinner | 7a8d081 | 2011-04-05 13:13:08 +0200 | [diff] [blame] | 1609 |                 timeout = self._remaining_time(endtime) | 
 | 1610 |                 if timeout is not None and timeout < 0: | 
 | 1611 |                     raise TimeoutExpired(self.args, orig_timeout) | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1612 |                 try: | 
| Victor Stinner | 7a8d081 | 2011-04-05 13:13:08 +0200 | [diff] [blame] | 1613 |                     ready = poller.poll(timeout) | 
| Andrew Svetlov | 6d8a122 | 2012-12-17 22:23:46 +0200 | [diff] [blame] | 1614 |                 except OSError as e: | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1615 |                     if e.args[0] == errno.EINTR: | 
 | 1616 |                         continue | 
 | 1617 |                     raise | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1618 |                 self._check_timeout(endtime, orig_timeout) | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1619 |  | 
 | 1620 |                 # XXX Rewrite these to use non-blocking I/O on the | 
 | 1621 |                 # file objects; they are no longer using C stdio! | 
 | 1622 |  | 
 | 1623 |                 for fd, mode in ready: | 
 | 1624 |                     if mode & select.POLLOUT: | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1625 |                         chunk = self._input[self._input_offset : | 
 | 1626 |                                             self._input_offset + _PIPE_BUF] | 
| Ross Lagerwall | 4f61b02 | 2011-04-05 15:34:00 +0200 | [diff] [blame] | 1627 |                         try: | 
| Ross Lagerwall | 0b9ea93 | 2011-04-05 16:07:49 +0200 | [diff] [blame] | 1628 |                             self._input_offset += os.write(fd, chunk) | 
| Ross Lagerwall | 4f61b02 | 2011-04-05 15:34:00 +0200 | [diff] [blame] | 1629 |                         except OSError as e: | 
 | 1630 |                             if e.errno == errno.EPIPE: | 
 | 1631 |                                 close_unregister_and_remove(fd) | 
 | 1632 |                             else: | 
 | 1633 |                                 raise | 
 | 1634 |                         else: | 
| Ross Lagerwall | 0b9ea93 | 2011-04-05 16:07:49 +0200 | [diff] [blame] | 1635 |                             if self._input_offset >= len(self._input): | 
| Ross Lagerwall | 4f61b02 | 2011-04-05 15:34:00 +0200 | [diff] [blame] | 1636 |                                 close_unregister_and_remove(fd) | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1637 |                     elif mode & select_POLLIN_POLLPRI: | 
 | 1638 |                         data = os.read(fd, 4096) | 
 | 1639 |                         if not data: | 
 | 1640 |                             close_unregister_and_remove(fd) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1641 |                         self._fd2output[fd].append(data) | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1642 |                     else: | 
 | 1643 |                         # Ignore hang up or errors. | 
 | 1644 |                         close_unregister_and_remove(fd) | 
 | 1645 |  | 
 | 1646 |             return (stdout, stderr) | 
 | 1647 |  | 
 | 1648 |  | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1649 |         def _communicate_with_select(self, input, endtime, orig_timeout): | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1650 |             if not self._communication_started: | 
 | 1651 |                 self._read_set = [] | 
 | 1652 |                 self._write_set = [] | 
 | 1653 |                 if self.stdin and input: | 
 | 1654 |                     self._write_set.append(self.stdin) | 
 | 1655 |                 if self.stdout: | 
 | 1656 |                     self._read_set.append(self.stdout) | 
 | 1657 |                 if self.stderr: | 
 | 1658 |                     self._read_set.append(self.stderr) | 
 | 1659 |  | 
| Andrew Svetlov | aa0dbdc | 2012-08-14 18:40:21 +0300 | [diff] [blame] | 1660 |             self._save_input(input) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1661 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1662 |             stdout = None # Return | 
 | 1663 |             stderr = None # Return | 
 | 1664 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1665 |             if self.stdout: | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1666 |                 if not self._communication_started: | 
 | 1667 |                     self._stdout_buff = [] | 
 | 1668 |                 stdout = self._stdout_buff | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1669 |             if self.stderr: | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1670 |                 if not self._communication_started: | 
 | 1671 |                     self._stderr_buff = [] | 
 | 1672 |                 stderr = self._stderr_buff | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1673 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1674 |             while self._read_set or self._write_set: | 
| Victor Stinner | 7a8d081 | 2011-04-05 13:13:08 +0200 | [diff] [blame] | 1675 |                 timeout = self._remaining_time(endtime) | 
 | 1676 |                 if timeout is not None and timeout < 0: | 
 | 1677 |                     raise TimeoutExpired(self.args, orig_timeout) | 
| Georg Brandl | 86b2fb9 | 2008-07-16 03:43:04 +0000 | [diff] [blame] | 1678 |                 try: | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1679 |                     (rlist, wlist, xlist) = \ | 
 | 1680 |                         select.select(self._read_set, self._write_set, [], | 
| Victor Stinner | 7a8d081 | 2011-04-05 13:13:08 +0200 | [diff] [blame] | 1681 |                                       timeout) | 
| Andrew Svetlov | 6d8a122 | 2012-12-17 22:23:46 +0200 | [diff] [blame] | 1682 |                 except OSError as e: | 
| Georg Brandl | 86b2fb9 | 2008-07-16 03:43:04 +0000 | [diff] [blame] | 1683 |                     if e.args[0] == errno.EINTR: | 
 | 1684 |                         continue | 
 | 1685 |                     raise | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1686 |  | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1687 |                 # According to the docs, returning three empty lists indicates | 
 | 1688 |                 # that the timeout expired. | 
 | 1689 |                 if not (rlist or wlist or xlist): | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1690 |                     raise TimeoutExpired(self.args, orig_timeout) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1691 |                 # We also check what time it is ourselves for good measure. | 
| Reid Kleckner | 2b228f0 | 2011-03-16 16:57:54 -0400 | [diff] [blame] | 1692 |                 self._check_timeout(endtime, orig_timeout) | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1693 |  | 
| Guido van Rossum | 98297ee | 2007-11-06 21:34:58 +0000 | [diff] [blame] | 1694 |                 # XXX Rewrite these to use non-blocking I/O on the | 
 | 1695 |                 # file objects; they are no longer using C stdio! | 
 | 1696 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1697 |                 if self.stdin in wlist: | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1698 |                     chunk = self._input[self._input_offset : | 
 | 1699 |                                         self._input_offset + _PIPE_BUF] | 
| Ross Lagerwall | 4f61b02 | 2011-04-05 15:34:00 +0200 | [diff] [blame] | 1700 |                     try: | 
 | 1701 |                         bytes_written = os.write(self.stdin.fileno(), chunk) | 
 | 1702 |                     except OSError as e: | 
 | 1703 |                         if e.errno == errno.EPIPE: | 
 | 1704 |                             self.stdin.close() | 
| Ross Lagerwall | 0b9ea93 | 2011-04-05 16:07:49 +0200 | [diff] [blame] | 1705 |                             self._write_set.remove(self.stdin) | 
| Ross Lagerwall | 4f61b02 | 2011-04-05 15:34:00 +0200 | [diff] [blame] | 1706 |                         else: | 
 | 1707 |                             raise | 
 | 1708 |                     else: | 
| Ross Lagerwall | 0b9ea93 | 2011-04-05 16:07:49 +0200 | [diff] [blame] | 1709 |                         self._input_offset += bytes_written | 
 | 1710 |                         if self._input_offset >= len(self._input): | 
| Ross Lagerwall | 4f61b02 | 2011-04-05 15:34:00 +0200 | [diff] [blame] | 1711 |                             self.stdin.close() | 
| Ross Lagerwall | 0b9ea93 | 2011-04-05 16:07:49 +0200 | [diff] [blame] | 1712 |                             self._write_set.remove(self.stdin) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1713 |  | 
 | 1714 |                 if self.stdout in rlist: | 
 | 1715 |                     data = os.read(self.stdout.fileno(), 1024) | 
| Guido van Rossum | c9e363c | 2007-05-15 23:18:55 +0000 | [diff] [blame] | 1716 |                     if not data: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1717 |                         self.stdout.close() | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1718 |                         self._read_set.remove(self.stdout) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1719 |                     stdout.append(data) | 
 | 1720 |  | 
 | 1721 |                 if self.stderr in rlist: | 
 | 1722 |                     data = os.read(self.stderr.fileno(), 1024) | 
| Guido van Rossum | c9e363c | 2007-05-15 23:18:55 +0000 | [diff] [blame] | 1723 |                     if not data: | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1724 |                         self.stderr.close() | 
| Reid Kleckner | 31aa7dd | 2011-03-14 12:02:10 -0400 | [diff] [blame] | 1725 |                         self._read_set.remove(self.stderr) | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1726 |                     stderr.append(data) | 
 | 1727 |  | 
| Fredrik Lundh | 5b3687d | 2004-10-12 15:26:28 +0000 | [diff] [blame] | 1728 |             return (stdout, stderr) | 
 | 1729 |  | 
| Gregory P. Smith | d06fa47 | 2009-07-04 02:46:54 +0000 | [diff] [blame] | 1730 |  | 
| Christian Heimes | a342c01 | 2008-04-20 21:01:16 +0000 | [diff] [blame] | 1731 |         def send_signal(self, sig): | 
 | 1732 |             """Send a signal to the process | 
 | 1733 |             """ | 
 | 1734 |             os.kill(self.pid, sig) | 
 | 1735 |  | 
 | 1736 |         def terminate(self): | 
 | 1737 |             """Terminate the process with SIGTERM | 
 | 1738 |             """ | 
 | 1739 |             self.send_signal(signal.SIGTERM) | 
 | 1740 |  | 
 | 1741 |         def kill(self): | 
 | 1742 |             """Kill the process with SIGKILL | 
 | 1743 |             """ | 
 | 1744 |             self.send_signal(signal.SIGKILL) |