blob: c8db387091ba396a5079c901ca25ce2cc8f6f506 [file] [log] [blame]
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001# subprocess - Subprocesses with accessible I/O streams
2#
Tim Peterse718f612004-10-12 21:51:32 +00003# For more information about this module, see PEP 324.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00004#
Peter Astrand3a708df2005-09-23 17:37:29 +00005# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se>
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00006#
Peter Astrand69bf13f2005-02-14 08:56:32 +00007# Licensed to PSF under a Contributor Agreement.
Peter Astrand3a708df2005-09-23 17:37:29 +00008# See http://www.python.org/2.4/license for licensing details.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00009
Martin Panter4afdca02016-10-25 22:20:48 +000010r"""Subprocesses with accessible I/O streams
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000011
Fredrik Lundh15aaacc2004-10-17 14:47:05 +000012This module allows you to spawn processes, connect to their
Martin Panter4afdca02016-10-25 22:20:48 +000013input/output/error pipes, and obtain their return codes.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000014
Martin Panter4afdca02016-10-25 22:20:48 +000015For a complete description of this module see the Python documentation.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000016
Martin Panter4afdca02016-10-25 22:20:48 +000017Main API
18========
19run(...): Runs a command, waits for it to complete, then returns a
20 CompletedProcess instance.
21Popen(...): A class for flexibly executing a command in a new process
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000022
Martin Panter4afdca02016-10-25 22:20:48 +000023Constants
24---------
25DEVNULL: Special value that indicates that os.devnull should be used
26PIPE: Special value that indicates a pipe should be created
27STDOUT: Special value that indicates that stderr should go to stdout
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000028
29
Martin Panter4afdca02016-10-25 22:20:48 +000030Older API
31=========
32call(...): Runs a command, waits for it to complete, then returns
33 the return code.
34check_call(...): Same as call() but raises CalledProcessError()
35 if return code is not 0
36check_output(...): Same as check_call() but returns the contents of
37 stdout instead of a return code
38getoutput(...): Runs a command in the shell, waits for it to complete,
39 then returns the output
40getstatusoutput(...): Runs a command in the shell, waits for it to complete,
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -070041 then returns a (exitcode, output) tuple
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000042"""
43
Zachary Ware880d42a2018-09-10 16:16:08 -070044import builtins
45import errno
Guido van Rossumfa0054a2007-05-24 04:05:35 +000046import io
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000047import os
Reid Kleckner31aa7dd2011-03-14 12:02:10 -040048import time
Christian Heimesa342c012008-04-20 21:01:16 +000049import signal
Zachary Ware880d42a2018-09-10 16:16:08 -070050import sys
51import threading
Gregory P. Smithd23047b2010-12-04 09:10:44 +000052import warnings
Giampaolo Rodolabafa8482019-01-29 22:14:24 +010053import contextlib
Victor Stinnerae586492014-09-02 23:18:25 +020054from time import monotonic as _time
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000055
Patrick McLean2b2ead72019-09-12 10:15:44 -070056try:
57 import pwd
58except ImportError:
59 pwd = None
60try:
61 import grp
62except ImportError:
63 grp = None
Zachary Ware880d42a2018-09-10 16:16:08 -070064
65__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput",
66 "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL",
67 "SubprocessError", "TimeoutExpired", "CompletedProcess"]
68 # NOTE: We intentionally exclude list2cmdline as it is
69 # considered an internal implementation detail. issue10838.
70
71try:
72 import msvcrt
73 import _winapi
74 _mswindows = True
75except ModuleNotFoundError:
76 _mswindows = False
77 import _posixsubprocess
78 import select
79 import selectors
80else:
81 from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
82 STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
83 STD_ERROR_HANDLE, SW_HIDE,
84 STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW,
85 ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
86 HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
87 NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
88 CREATE_NO_WINDOW, DETACHED_PROCESS,
89 CREATE_DEFAULT_ERROR_MODE, CREATE_BREAKAWAY_FROM_JOB)
90
91 __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP",
92 "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
93 "STD_ERROR_HANDLE", "SW_HIDE",
94 "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW",
95 "STARTUPINFO",
96 "ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
97 "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
98 "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS",
99 "CREATE_NO_WINDOW", "DETACHED_PROCESS",
100 "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"])
101
102
Peter Astrand454f7672005-01-01 09:36:35 +0000103# Exception classes used by this module.
Gregory P. Smith54d412e2011-03-14 14:08:43 -0400104class SubprocessError(Exception): pass
105
106
107class CalledProcessError(SubprocessError):
Martin Panter4afdca02016-10-25 22:20:48 +0000108 """Raised when run() is called with check=True and the process
109 returns a non-zero exit status.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)d6da7602016-06-03 06:14:06 +0000110
Martin Panter4afdca02016-10-25 22:20:48 +0000111 Attributes:
112 cmd, returncode, stdout, stderr, output
Georg Brandlf9734072008-12-07 15:30:06 +0000113 """
Gregory P. Smith6e730002015-04-14 16:14:25 -0700114 def __init__(self, returncode, cmd, output=None, stderr=None):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000115 self.returncode = returncode
116 self.cmd = cmd
Georg Brandlf9734072008-12-07 15:30:06 +0000117 self.output = output
Gregory P. Smith6e730002015-04-14 16:14:25 -0700118 self.stderr = stderr
119
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000120 def __str__(self):
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)d6da7602016-06-03 06:14:06 +0000121 if self.returncode and self.returncode < 0:
122 try:
123 return "Command '%s' died with %r." % (
124 self.cmd, signal.Signals(-self.returncode))
125 except ValueError:
126 return "Command '%s' died with unknown signal %d." % (
127 self.cmd, -self.returncode)
128 else:
129 return "Command '%s' returned non-zero exit status %d." % (
130 self.cmd, self.returncode)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000131
Gregory P. Smith6e730002015-04-14 16:14:25 -0700132 @property
133 def stdout(self):
134 """Alias for output attribute, to match stderr"""
135 return self.output
136
137 @stdout.setter
138 def stdout(self, value):
139 # There's no obvious reason to set this, but allow it anyway so
140 # .stdout is a transparent alias for .output
141 self.output = value
142
Peter Astrand454f7672005-01-01 09:36:35 +0000143
Gregory P. Smith54d412e2011-03-14 14:08:43 -0400144class TimeoutExpired(SubprocessError):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400145 """This exception is raised when the timeout expires while waiting for a
146 child process.
Martin Panter4afdca02016-10-25 22:20:48 +0000147
148 Attributes:
149 cmd, output, stdout, stderr, timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400150 """
Gregory P. Smith6e730002015-04-14 16:14:25 -0700151 def __init__(self, cmd, timeout, output=None, stderr=None):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400152 self.cmd = cmd
Reid Kleckner2b228f02011-03-16 16:57:54 -0400153 self.timeout = timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400154 self.output = output
Gregory P. Smith6e730002015-04-14 16:14:25 -0700155 self.stderr = stderr
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400156
157 def __str__(self):
158 return ("Command '%s' timed out after %s seconds" %
159 (self.cmd, self.timeout))
160
Gregory P. Smith6e730002015-04-14 16:14:25 -0700161 @property
162 def stdout(self):
163 return self.output
164
165 @stdout.setter
166 def stdout(self, value):
167 # There's no obvious reason to set this, but allow it anyway so
168 # .stdout is a transparent alias for .output
169 self.output = value
170
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400171
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700172if _mswindows:
Brian Curtin1ce6b582010-04-24 16:19:22 +0000173 class STARTUPINFO:
Subhendu Ghoshae160bb2017-02-25 20:29:05 +0530174 def __init__(self, *, dwFlags=0, hStdInput=None, hStdOutput=None,
Segev Finerb2a60832017-12-18 11:28:19 +0200175 hStdError=None, wShowWindow=0, lpAttributeList=None):
Subhendu Ghoshae160bb2017-02-25 20:29:05 +0530176 self.dwFlags = dwFlags
177 self.hStdInput = hStdInput
178 self.hStdOutput = hStdOutput
179 self.hStdError = hStdError
180 self.wShowWindow = wShowWindow
Segev Finerb2a60832017-12-18 11:28:19 +0200181 self.lpAttributeList = lpAttributeList or {"handle_list": []}
Victor Stinner483422f2018-07-05 22:54:17 +0200182
183 def copy(self):
184 attr_list = self.lpAttributeList.copy()
185 if 'handle_list' in attr_list:
186 attr_list['handle_list'] = list(attr_list['handle_list'])
187
188 return STARTUPINFO(dwFlags=self.dwFlags,
189 hStdInput=self.hStdInput,
190 hStdOutput=self.hStdOutput,
191 hStdError=self.hStdError,
192 wShowWindow=self.wShowWindow,
193 lpAttributeList=attr_list)
194
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200195
196 class Handle(int):
197 closed = False
198
199 def Close(self, CloseHandle=_winapi.CloseHandle):
200 if not self.closed:
201 self.closed = True
202 CloseHandle(self)
203
204 def Detach(self):
205 if not self.closed:
206 self.closed = True
207 return int(self)
208 raise ValueError("already closed")
209
210 def __repr__(self):
Serhiy Storchaka465e60e2014-07-25 23:36:00 +0300211 return "%s(%d)" % (self.__class__.__name__, int(self))
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200212
213 __del__ = Close
Zachary Ware880d42a2018-09-10 16:16:08 -0700214else:
215 # When select or poll has indicated that the file is writable,
216 # we can write up to _PIPE_BUF bytes without risk of blocking.
217 # POSIX defines PIPE_BUF as >= 512.
218 _PIPE_BUF = getattr(select, 'PIPE_BUF', 512)
219
220 # poll/select have the advantage of not requiring any extra file
221 # descriptor, contrarily to epoll/kqueue (also, they require a single
222 # syscall).
223 if hasattr(selectors, 'PollSelector'):
224 _PopenSelector = selectors.PollSelector
225 else:
226 _PopenSelector = selectors.SelectSelector
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200227
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000228
Ruslan Kuprieiev042821a2019-06-28 19:12:16 +0300229if _mswindows:
230 # On Windows we just need to close `Popen._handle` when we no longer need
231 # it, so that the kernel can free it. `Popen._handle` gets closed
232 # implicitly when the `Popen` instance is finalized (see `Handle.__del__`,
233 # which is calling `CloseHandle` as requested in [1]), so there is nothing
234 # for `_cleanup` to do.
235 #
236 # [1] https://docs.microsoft.com/en-us/windows/desktop/ProcThread/
237 # creating-processes
238 _active = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000239
Ruslan Kuprieiev042821a2019-06-28 19:12:16 +0300240 def _cleanup():
241 pass
242else:
243 # This lists holds Popen instances for which the underlying process had not
244 # exited at the time its __del__ method got called: those processes are
245 # wait()ed for synchronously from _cleanup() when a new Popen object is
246 # created, to avoid zombie processes.
247 _active = []
248
249 def _cleanup():
250 if _active is None:
251 return
252 for inst in _active[:]:
253 res = inst._internal_poll(_deadstate=sys.maxsize)
254 if res is not None:
255 try:
256 _active.remove(inst)
257 except ValueError:
258 # This can happen if two threads create a new Popen instance.
259 # It's harmless that it was already removed, so ignore.
260 pass
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000261
262PIPE = -1
263STDOUT = -2
Ross Lagerwallba102ec2011-03-16 18:40:25 +0200264DEVNULL = -3
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000265
266
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200267# XXX This function is only used by multiprocessing and the test suite,
268# but it's here so that it can be imported when Python is compiled without
269# threads.
270
Victor Stinner9def2842016-01-18 12:15:08 +0100271def _optim_args_from_interpreter_flags():
272 """Return a list of command-line arguments reproducing the current
273 optimization settings in sys.flags."""
274 args = []
275 value = sys.flags.optimize
276 if value > 0:
277 args.append('-' + 'O' * value)
278 return args
279
280
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200281def _args_from_interpreter_flags():
282 """Return a list of command-line arguments reproducing the current
Victor Stinner747f48e2017-12-12 22:59:48 +0100283 settings in sys.flags, sys.warnoptions and sys._xoptions."""
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200284 flag_opt_map = {
285 'debug': 'd',
286 # 'inspect': 'i',
287 # 'interactive': 'i',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200288 'dont_write_bytecode': 'B',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200289 'no_site': 'S',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200290 'verbose': 'v',
291 'bytes_warning': 'b',
292 'quiet': 'q',
Victor Stinner9def2842016-01-18 12:15:08 +0100293 # -O is handled in _optim_args_from_interpreter_flags()
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200294 }
Victor Stinner9def2842016-01-18 12:15:08 +0100295 args = _optim_args_from_interpreter_flags()
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200296 for flag, opt in flag_opt_map.items():
297 v = getattr(sys.flags, flag)
298 if v > 0:
299 args.append('-' + opt * v)
Victor Stinnerf39b6742017-11-20 15:24:56 -0800300
Victor Stinner9de36322018-11-23 17:54:20 +0100301 if sys.flags.isolated:
302 args.append('-I')
303 else:
304 if sys.flags.ignore_environment:
305 args.append('-E')
306 if sys.flags.no_user_site:
307 args.append('-s')
308
Victor Stinnerf39b6742017-11-20 15:24:56 -0800309 # -W options
Victor Stinner747f48e2017-12-12 22:59:48 +0100310 warnopts = sys.warnoptions[:]
311 bytes_warning = sys.flags.bytes_warning
312 xoptions = getattr(sys, '_xoptions', {})
313 dev_mode = ('dev' in xoptions)
314
315 if bytes_warning > 1:
316 warnopts.remove("error::BytesWarning")
317 elif bytes_warning:
318 warnopts.remove("default::BytesWarning")
319 if dev_mode:
320 warnopts.remove('default')
321 for opt in warnopts:
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200322 args.append('-W' + opt)
Victor Stinnerf39b6742017-11-20 15:24:56 -0800323
324 # -X options
Victor Stinner747f48e2017-12-12 22:59:48 +0100325 if dev_mode:
Victor Stinnerf39b6742017-11-20 15:24:56 -0800326 args.extend(('-X', 'dev'))
327 for opt in ('faulthandler', 'tracemalloc', 'importtime',
Victor Stinnerc6e5c112020-02-03 15:17:15 +0100328 'showrefcount', 'utf8'):
Victor Stinnerf39b6742017-11-20 15:24:56 -0800329 if opt in xoptions:
330 value = xoptions[opt]
331 if value is True:
332 arg = opt
333 else:
334 arg = '%s=%s' % (opt, value)
335 args.extend(('-X', arg))
336
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200337 return args
338
339
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400340def call(*popenargs, timeout=None, **kwargs):
341 """Run command with arguments. Wait for command to complete or
342 timeout, then return the returncode attribute.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000343
344 The arguments are the same as for the Popen constructor. Example:
345
346 retcode = call(["ls", "-l"])
347 """
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200348 with Popen(*popenargs, **kwargs) as p:
349 try:
350 return p.wait(timeout=timeout)
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800351 except: # Including KeyboardInterrupt, wait handled that.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200352 p.kill()
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800353 # We don't call p.wait() again as p.__exit__ does that for us.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200354 raise
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000355
356
Peter Astrand454f7672005-01-01 09:36:35 +0000357def check_call(*popenargs, **kwargs):
358 """Run command with arguments. Wait for command to complete. If
359 the exit code was zero then return, otherwise raise
360 CalledProcessError. The CalledProcessError object will have the
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000361 return code in the returncode attribute.
Peter Astrand454f7672005-01-01 09:36:35 +0000362
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400363 The arguments are the same as for the call function. Example:
Peter Astrand454f7672005-01-01 09:36:35 +0000364
365 check_call(["ls", "-l"])
366 """
367 retcode = call(*popenargs, **kwargs)
Peter Astrand454f7672005-01-01 09:36:35 +0000368 if retcode:
Georg Brandlf9734072008-12-07 15:30:06 +0000369 cmd = kwargs.get("args")
370 if cmd is None:
371 cmd = popenargs[0]
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000372 raise CalledProcessError(retcode, cmd)
Georg Brandlf9734072008-12-07 15:30:06 +0000373 return 0
374
375
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400376def check_output(*popenargs, timeout=None, **kwargs):
Gregory P. Smith91110f52013-03-19 23:25:16 -0700377 r"""Run command with arguments and return its output.
Georg Brandlf9734072008-12-07 15:30:06 +0000378
379 If the exit code was non-zero it raises a CalledProcessError. The
380 CalledProcessError object will have the return code in the returncode
381 attribute and output in the output attribute.
382
383 The arguments are the same as for the Popen constructor. Example:
384
385 >>> check_output(["ls", "-l", "/dev/null"])
Georg Brandl2708f3a2009-12-20 14:38:23 +0000386 b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
Georg Brandlf9734072008-12-07 15:30:06 +0000387
388 The stdout argument is not allowed as it is used internally.
Georg Brandl127d4702009-12-28 08:10:38 +0000389 To capture standard error in the result, use stderr=STDOUT.
Georg Brandlf9734072008-12-07 15:30:06 +0000390
391 >>> check_output(["/bin/sh", "-c",
Georg Brandl2708f3a2009-12-20 14:38:23 +0000392 ... "ls -l non_existent_file ; exit 0"],
Georg Brandl127d4702009-12-28 08:10:38 +0000393 ... stderr=STDOUT)
Georg Brandl2708f3a2009-12-20 14:38:23 +0000394 b'ls: non_existent_file: No such file or directory\n'
Gregory P. Smith91110f52013-03-19 23:25:16 -0700395
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300396 There is an additional optional argument, "input", allowing you to
397 pass a string to the subprocess's stdin. If you use this argument
398 you may not also use the Popen constructor's "stdin" argument, as
399 it too will be used internally. Example:
400
401 >>> check_output(["sed", "-e", "s/foo/bar/"],
402 ... input=b"when in the course of fooman events\n")
403 b'when in the course of barman events\n'
404
andyclegg7fed7bd2017-10-23 03:01:19 +0100405 By default, all communication is in bytes, and therefore any "input"
Matthias182e1d12019-09-10 15:51:09 +0200406 should be bytes, and the return value will be bytes. If in text mode,
andyclegg7fed7bd2017-10-23 03:01:19 +0100407 any "input" should be a string, and the return value will be a string
408 decoded according to locale encoding, or by "encoding" if set. Text mode
409 is triggered by setting any of text, encoding, errors or universal_newlines.
Georg Brandlf9734072008-12-07 15:30:06 +0000410 """
411 if 'stdout' in kwargs:
412 raise ValueError('stdout argument not allowed, it will be overridden.')
Gregory P. Smith6e730002015-04-14 16:14:25 -0700413
414 if 'input' in kwargs and kwargs['input'] is None:
415 # Explicitly passing input=None was previously equivalent to passing an
416 # empty string. That is maintained here for backwards compatibility.
417 kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b''
418
419 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
420 **kwargs).stdout
421
422
423class CompletedProcess(object):
424 """A process that has finished running.
425
426 This is returned by run().
427
428 Attributes:
429 args: The list or str args passed to run().
430 returncode: The exit code of the process, negative for signals.
431 stdout: The standard output (None if not captured).
432 stderr: The standard error (None if not captured).
433 """
434 def __init__(self, args, returncode, stdout=None, stderr=None):
435 self.args = args
436 self.returncode = returncode
437 self.stdout = stdout
438 self.stderr = stderr
439
440 def __repr__(self):
441 args = ['args={!r}'.format(self.args),
442 'returncode={!r}'.format(self.returncode)]
443 if self.stdout is not None:
444 args.append('stdout={!r}'.format(self.stdout))
445 if self.stderr is not None:
446 args.append('stderr={!r}'.format(self.stderr))
447 return "{}({})".format(type(self).__name__, ', '.join(args))
448
Batuhan Taşkaya4dc5a9d2019-12-30 19:02:04 +0300449 def __class_getitem__(cls, type):
450 """Provide minimal support for using this class as generic
451 (for example in type annotations).
452
453 See PEP 484 and PEP 560 for more details. For example,
454 `CompletedProcess[bytes]` is a valid expression at runtime
455 (type argument `bytes` indicates the type used for stdout).
456 Note, no type checking happens at runtime, but a static type
457 checker can be used.
458 """
459 return cls
460
461
Gregory P. Smith6e730002015-04-14 16:14:25 -0700462 def check_returncode(self):
463 """Raise CalledProcessError if the exit code is non-zero."""
464 if self.returncode:
465 raise CalledProcessError(self.returncode, self.args, self.stdout,
466 self.stderr)
467
468
Bo Baylesce0f33d2018-01-30 00:40:39 -0600469def run(*popenargs,
470 input=None, capture_output=False, timeout=None, check=False, **kwargs):
Gregory P. Smith6e730002015-04-14 16:14:25 -0700471 """Run command with arguments and return a CompletedProcess instance.
472
473 The returned instance will have attributes args, returncode, stdout and
474 stderr. By default, stdout and stderr are not captured, and those attributes
475 will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them.
476
477 If check is True and the exit code was non-zero, it raises a
478 CalledProcessError. The CalledProcessError object will have the return code
479 in the returncode attribute, and output & stderr attributes if those streams
480 were captured.
481
482 If timeout is given, and the process takes too long, a TimeoutExpired
483 exception will be raised.
484
485 There is an optional argument "input", allowing you to
andyclegg7fed7bd2017-10-23 03:01:19 +0100486 pass bytes or a string to the subprocess's stdin. If you use this argument
Gregory P. Smith6e730002015-04-14 16:14:25 -0700487 you may not also use the Popen constructor's "stdin" argument, as
488 it will be used internally.
489
andyclegg7fed7bd2017-10-23 03:01:19 +0100490 By default, all communication is in bytes, and therefore any "input" should
491 be bytes, and the stdout and stderr will be bytes. If in text mode, any
492 "input" should be a string, and stdout and stderr will be strings decoded
493 according to locale encoding, or by "encoding" if set. Text mode is
494 triggered by setting any of text, encoding, errors or universal_newlines.
Gregory P. Smith6e730002015-04-14 16:14:25 -0700495
andyclegg7fed7bd2017-10-23 03:01:19 +0100496 The other arguments are the same as for the Popen constructor.
Gregory P. Smith6e730002015-04-14 16:14:25 -0700497 """
498 if input is not None:
Rémi Lapeyre8cc605a2019-06-08 16:56:24 +0200499 if kwargs.get('stdin') is not None:
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300500 raise ValueError('stdin and input arguments may not both be used.')
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300501 kwargs['stdin'] = PIPE
Gregory P. Smith6e730002015-04-14 16:14:25 -0700502
Bo Baylesce0f33d2018-01-30 00:40:39 -0600503 if capture_output:
Rémi Lapeyre8cc605a2019-06-08 16:56:24 +0200504 if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None:
Bo Baylesce0f33d2018-01-30 00:40:39 -0600505 raise ValueError('stdout and stderr arguments may not be used '
506 'with capture_output.')
507 kwargs['stdout'] = PIPE
508 kwargs['stderr'] = PIPE
509
Gregory P. Smith6e730002015-04-14 16:14:25 -0700510 with Popen(*popenargs, **kwargs) as process:
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200511 try:
Gregory P. Smith6e730002015-04-14 16:14:25 -0700512 stdout, stderr = process.communicate(input, timeout=timeout)
Gregory P. Smith580d2782019-09-11 04:23:05 -0500513 except TimeoutExpired as exc:
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200514 process.kill()
Gregory P. Smith580d2782019-09-11 04:23:05 -0500515 if _mswindows:
516 # Windows accumulates the output in a single blocking
517 # read() call run on child threads, with the timeout
518 # being done in a join() on those threads. communicate()
519 # _after_ kill() is required to collect that and add it
520 # to the exception.
521 exc.stdout, exc.stderr = process.communicate()
522 else:
523 # POSIX _communicate already populated the output so
524 # far into the TimeoutExpired exception.
525 process.wait()
526 raise
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800527 except: # Including KeyboardInterrupt, communicate handled that.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200528 process.kill()
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800529 # We don't call process.wait() as .__exit__ does that for us.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200530 raise
531 retcode = process.poll()
Gregory P. Smith6e730002015-04-14 16:14:25 -0700532 if check and retcode:
533 raise CalledProcessError(retcode, process.args,
534 output=stdout, stderr=stderr)
535 return CompletedProcess(process.args, retcode, stdout, stderr)
Peter Astrand454f7672005-01-01 09:36:35 +0000536
537
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000538def list2cmdline(seq):
539 """
540 Translate a sequence of arguments into a command line
541 string, using the same rules as the MS C runtime:
542
543 1) Arguments are delimited by white space, which is either a
544 space or a tab.
545
546 2) A string surrounded by double quotation marks is
547 interpreted as a single argument, regardless of white space
Jean-Paul Calderone1ddd4072010-06-18 20:03:54 +0000548 contained within. A quoted string can be embedded in an
549 argument.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000550
551 3) A double quotation mark preceded by a backslash is
552 interpreted as a literal double quotation mark.
553
554 4) Backslashes are interpreted literally, unless they
555 immediately precede a double quotation mark.
556
557 5) If backslashes immediately precede a double quotation mark,
558 every pair of backslashes is interpreted as a literal
559 backslash. If the number of backslashes is odd, the last
560 backslash escapes the next double quotation mark as
561 described in rule 3.
562 """
563
564 # See
Eric Smith3c573af2009-11-09 15:23:15 +0000565 # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
566 # or search http://msdn.microsoft.com for
567 # "Parsing C++ Command-Line Arguments"
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000568 result = []
569 needquote = False
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +0300570 for arg in map(os.fsdecode, seq):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000571 bs_buf = []
572
573 # Add a space to separate this argument from the others
574 if result:
575 result.append(' ')
576
Jean-Paul Calderone1ddd4072010-06-18 20:03:54 +0000577 needquote = (" " in arg) or ("\t" in arg) or not arg
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000578 if needquote:
579 result.append('"')
580
581 for c in arg:
582 if c == '\\':
Tim Peterse718f612004-10-12 21:51:32 +0000583 # Don't know if we need to double yet.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000584 bs_buf.append(c)
585 elif c == '"':
Christian Heimesfdab48e2008-01-20 09:06:41 +0000586 # Double backslashes.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000587 result.append('\\' * len(bs_buf)*2)
588 bs_buf = []
589 result.append('\\"')
590 else:
591 # Normal char
592 if bs_buf:
593 result.extend(bs_buf)
594 bs_buf = []
595 result.append(c)
596
Christian Heimesfdab48e2008-01-20 09:06:41 +0000597 # Add remaining backslashes, if any.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000598 if bs_buf:
599 result.extend(bs_buf)
600
601 if needquote:
Peter Astrand7e78ade2005-03-03 21:10:23 +0000602 result.extend(bs_buf)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000603 result.append('"')
604
605 return ''.join(result)
606
607
Brett Cannona23810f2008-05-26 19:04:21 +0000608# Various tools for executing commands and looking at their output and status.
609#
Brett Cannona23810f2008-05-26 19:04:21 +0000610
611def getstatusoutput(cmd):
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700612 """Return (exitcode, output) of executing cmd in a shell.
Brett Cannona23810f2008-05-26 19:04:21 +0000613
Tim Golden60798142013-11-05 12:57:25 +0000614 Execute the string 'cmd' in a shell with 'check_output' and
Steve Dower050acae2016-09-06 20:16:17 -0700615 return a 2-tuple (status, output). The locale encoding is used
616 to decode the output and process newlines.
Tim Golden60798142013-11-05 12:57:25 +0000617
618 A trailing newline is stripped from the output.
619 The exit status for the command can be interpreted
620 according to the rules for the function 'wait'. Example:
Brett Cannona23810f2008-05-26 19:04:21 +0000621
622 >>> import subprocess
623 >>> subprocess.getstatusoutput('ls /bin/ls')
624 (0, '/bin/ls')
625 >>> subprocess.getstatusoutput('cat /bin/junk')
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700626 (1, 'cat: /bin/junk: No such file or directory')
Brett Cannona23810f2008-05-26 19:04:21 +0000627 >>> subprocess.getstatusoutput('/bin/junk')
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700628 (127, 'sh: /bin/junk: not found')
629 >>> subprocess.getstatusoutput('/bin/kill $$')
630 (-15, '')
Brett Cannona23810f2008-05-26 19:04:21 +0000631 """
Tim Goldene0041752013-11-03 12:53:17 +0000632 try:
andyclegg7fed7bd2017-10-23 03:01:19 +0100633 data = check_output(cmd, shell=True, text=True, stderr=STDOUT)
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700634 exitcode = 0
Tim Goldene0041752013-11-03 12:53:17 +0000635 except CalledProcessError as ex:
636 data = ex.output
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700637 exitcode = ex.returncode
Tim Goldene0041752013-11-03 12:53:17 +0000638 if data[-1:] == '\n':
639 data = data[:-1]
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700640 return exitcode, data
Brett Cannona23810f2008-05-26 19:04:21 +0000641
642def getoutput(cmd):
643 """Return output (stdout or stderr) of executing cmd in a shell.
644
645 Like getstatusoutput(), except the exit status is ignored and the return
646 value is a string containing the command's output. Example:
647
648 >>> import subprocess
649 >>> subprocess.getoutput('ls /bin/ls')
650 '/bin/ls'
651 """
652 return getstatusoutput(cmd)[1]
653
654
Victor Stinner9daecf32019-01-16 00:02:35 +0100655def _use_posix_spawn():
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800656 """Check if posix_spawn() can be used for subprocess.
Victor Stinner9daecf32019-01-16 00:02:35 +0100657
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800658 subprocess requires a posix_spawn() implementation that properly reports
659 errors to the parent process, & sets errno on the following failures:
Victor Stinner9daecf32019-01-16 00:02:35 +0100660
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800661 * Process attribute actions failed.
662 * File actions failed.
663 * exec() failed.
Victor Stinner9daecf32019-01-16 00:02:35 +0100664
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800665 Prefer an implementation which can use vfork() in some cases for best
666 performance.
Victor Stinner9daecf32019-01-16 00:02:35 +0100667 """
668 if _mswindows or not hasattr(os, 'posix_spawn'):
669 # os.posix_spawn() is not available
670 return False
671
672 if sys.platform == 'darwin':
673 # posix_spawn() is a syscall on macOS and properly reports errors
674 return True
675
676 # Check libc name and runtime libc version
677 try:
678 ver = os.confstr('CS_GNU_LIBC_VERSION')
679 # parse 'glibc 2.28' as ('glibc', (2, 28))
680 parts = ver.split(maxsplit=1)
681 if len(parts) != 2:
682 # reject unknown format
683 raise ValueError
684 libc = parts[0]
685 version = tuple(map(int, parts[1].split('.')))
686
687 if sys.platform == 'linux' and libc == 'glibc' and version >= (2, 24):
688 # glibc 2.24 has a new Linux posix_spawn implementation using vfork
689 # which properly reports errors to the parent process.
690 return True
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800691 # Note: Don't use the implementation in earlier glibc because it doesn't
Victor Stinner9daecf32019-01-16 00:02:35 +0100692 # use vfork (even if glibc 2.26 added a pipe to properly report errors
693 # to the parent process).
694 except (AttributeError, ValueError, OSError):
695 # os.confstr() or CS_GNU_LIBC_VERSION value not available
696 pass
697
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800698 # By default, assume that posix_spawn() does not properly report errors.
Victor Stinner9daecf32019-01-16 00:02:35 +0100699 return False
700
701
702_USE_POSIX_SPAWN = _use_posix_spawn()
703
704
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000705class Popen(object):
Martin Panter4afdca02016-10-25 22:20:48 +0000706 """ Execute a child program in a new process.
Serhiy Storchaka72e77612014-02-10 19:20:22 +0200707
Martin Panter4afdca02016-10-25 22:20:48 +0000708 For a complete description of the arguments see the Python documentation.
709
710 Arguments:
711 args: A string, or a sequence of program arguments.
712
713 bufsize: supplied as the buffering argument to the open() function when
714 creating the stdin/stdout/stderr pipe file objects
715
716 executable: A replacement program to execute.
717
718 stdin, stdout and stderr: These specify the executed programs' standard
719 input, standard output and standard error file handles, respectively.
720
721 preexec_fn: (POSIX only) An object to be called in the child process
722 just before the child is executed.
723
724 close_fds: Controls closing or inheriting of file descriptors.
725
726 shell: If true, the command will be executed through the shell.
727
728 cwd: Sets the current directory before the child is executed.
729
730 env: Defines the environment variables for the new process.
731
andyclegg7fed7bd2017-10-23 03:01:19 +0100732 text: If true, decode stdin, stdout and stderr using the given encoding
733 (if set) or the system default otherwise.
734
735 universal_newlines: Alias of text, provided for backwards compatibility.
Martin Panter4afdca02016-10-25 22:20:48 +0000736
737 startupinfo and creationflags (Windows only)
738
739 restore_signals (POSIX only)
740
741 start_new_session (POSIX only)
742
Patrick McLean2b2ead72019-09-12 10:15:44 -0700743 group (POSIX only)
744
745 extra_groups (POSIX only)
746
747 user (POSIX only)
748
Gregory P. Smithf3751ef2019-10-12 13:24:56 -0700749 umask (POSIX only)
750
Martin Panter4afdca02016-10-25 22:20:48 +0000751 pass_fds (POSIX only)
752
Martin Panter3dca6242016-10-25 23:41:42 +0000753 encoding and errors: Text mode encoding and error handling to use for
754 file objects stdin, stdout and stderr.
755
Martin Panter4afdca02016-10-25 22:20:48 +0000756 Attributes:
757 stdin, stdout, stderr, pid, returncode
758 """
Serhiy Storchaka72e77612014-02-10 19:20:22 +0200759 _child_created = False # Set here since __del__ checks it
760
Gregory P. Smitha1ed5392013-03-23 11:44:25 -0700761 def __init__(self, args, bufsize=-1, executable=None,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000762 stdin=None, stdout=None, stderr=None,
Segev Finerb2a60832017-12-18 11:28:19 +0200763 preexec_fn=None, close_fds=True,
andyclegg7fed7bd2017-10-23 03:01:19 +0100764 shell=False, cwd=None, env=None, universal_newlines=None,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000765 startupinfo=None, creationflags=0,
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000766 restore_signals=True, start_new_session=False,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700767 pass_fds=(), *, user=None, group=None, extra_groups=None,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -0700768 encoding=None, errors=None, text=None, umask=-1):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000769 """Create new Popen instance."""
770 _cleanup()
Gregory P. Smithd65ba512014-04-23 00:27:17 -0700771 # Held while anything is calling waitpid before returncode has been
772 # updated to prevent clobbering returncode if wait() or poll() are
773 # called from multiple threads at once. After acquiring the lock,
774 # code must re-check self.returncode to see if another thread just
775 # finished a waitpid() call.
776 self._waitpid_lock = threading.Lock()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000777
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400778 self._input = None
779 self._communication_started = False
Guido van Rossum46a05a72007-06-07 21:56:45 +0000780 if bufsize is None:
Gregory P. Smitha1ed5392013-03-23 11:44:25 -0700781 bufsize = -1 # Restore default
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000782 if not isinstance(bufsize, int):
Peter Astrand738131d2004-11-30 21:04:45 +0000783 raise TypeError("bufsize must be an integer")
784
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700785 if _mswindows:
Tim Peterse8374a52004-10-13 03:15:00 +0000786 if preexec_fn is not None:
787 raise ValueError("preexec_fn is not supported on Windows "
788 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000789 else:
790 # POSIX
Gregory P. Smith8edd99d2010-12-14 13:43:30 +0000791 if pass_fds and not close_fds:
792 warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
793 close_fds = True
Tim Peterse8374a52004-10-13 03:15:00 +0000794 if startupinfo is not None:
795 raise ValueError("startupinfo is only supported on Windows "
796 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000797 if creationflags != 0:
Tim Peterse8374a52004-10-13 03:15:00 +0000798 raise ValueError("creationflags is only supported on Windows "
799 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000800
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400801 self.args = args
Tim Peterse718f612004-10-12 21:51:32 +0000802 self.stdin = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000803 self.stdout = None
804 self.stderr = None
805 self.pid = None
806 self.returncode = None
Steve Dower050acae2016-09-06 20:16:17 -0700807 self.encoding = encoding
808 self.errors = errors
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000809
andyclegg7fed7bd2017-10-23 03:01:19 +0100810 # Validate the combinations of text and universal_newlines
811 if (text is not None and universal_newlines is not None
812 and bool(universal_newlines) != bool(text)):
813 raise SubprocessError('Cannot disambiguate when both text '
814 'and universal_newlines are supplied but '
815 'different. Pass one or the other.')
816
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000817 # Input and output objects. The general principle is like
818 # this:
819 #
820 # Parent Child
821 # ------ -----
822 # p2cwrite ---stdin---> p2cread
823 # c2pread <--stdout--- c2pwrite
824 # errread <--stderr--- errwrite
825 #
826 # On POSIX, the child objects are file descriptors. On
827 # Windows, these are Windows file handles. The parent objects
828 # are file descriptors on both platforms. The parent objects
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000829 # are -1 when not using PIPEs. The child objects are -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000830 # when not redirecting.
Tim Peterse718f612004-10-12 21:51:32 +0000831
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000832 (p2cread, p2cwrite,
833 c2pread, c2pwrite,
834 errread, errwrite) = self._get_handles(stdin, stdout, stderr)
835
Antoine Pitrouc9982322011-01-04 19:07:07 +0000836 # We wrap OS handles *before* launching the child, otherwise a
837 # quickly terminating child could make our fds unwrappable
838 # (see #8458).
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000839
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700840 if _mswindows:
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000841 if p2cwrite != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000842 p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000843 if c2pread != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000844 c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000845 if errread != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000846 errread = msvcrt.open_osfhandle(errread.Detach(), 0)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000847
andyclegg7fed7bd2017-10-23 03:01:19 +0100848 self.text_mode = encoding or errors or text or universal_newlines
Tim Peterse718f612004-10-12 21:51:32 +0000849
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800850 # How long to resume waiting on a child after the first ^C.
851 # There is no right value for this. The purpose is to be polite
852 # yet remain good for interactive users trying to exit a tool.
853 self._sigint_wait_secs = 0.25 # 1/xkcd221.getRandomNumber()
854
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700855 self._closed_child_pipe_fds = False
Steve Dower050acae2016-09-06 20:16:17 -0700856
Alexey Izbysheva2670562018-10-20 03:22:31 +0300857 if self.text_mode:
858 if bufsize == 1:
859 line_buffering = True
860 # Use the default buffer size for the underlying binary streams
861 # since they don't support line buffering.
862 bufsize = -1
863 else:
864 line_buffering = False
865
Patrick McLean2b2ead72019-09-12 10:15:44 -0700866 gid = None
867 if group is not None:
868 if not hasattr(os, 'setregid'):
869 raise ValueError("The 'group' parameter is not supported on the "
870 "current platform")
871
872 elif isinstance(group, str):
873 if grp is None:
874 raise ValueError("The group parameter cannot be a string "
875 "on systems without the grp module")
876
877 gid = grp.getgrnam(group).gr_gid
878 elif isinstance(group, int):
879 gid = group
880 else:
881 raise TypeError("Group must be a string or an integer, not {}"
882 .format(type(group)))
883
884 if gid < 0:
885 raise ValueError(f"Group ID cannot be negative, got {gid}")
886
887 gids = None
888 if extra_groups is not None:
889 if not hasattr(os, 'setgroups'):
890 raise ValueError("The 'extra_groups' parameter is not "
891 "supported on the current platform")
892
893 elif isinstance(extra_groups, str):
894 raise ValueError("Groups must be a list, not a string")
895
896 gids = []
897 for extra_group in extra_groups:
898 if isinstance(extra_group, str):
899 if grp is None:
900 raise ValueError("Items in extra_groups cannot be "
901 "strings on systems without the "
902 "grp module")
903
904 gids.append(grp.getgrnam(extra_group).gr_gid)
905 elif isinstance(extra_group, int):
906 gids.append(extra_group)
907 else:
908 raise TypeError("Items in extra_groups must be a string "
909 "or integer, not {}"
910 .format(type(extra_group)))
911
912 # make sure that the gids are all positive here so we can do less
913 # checking in the C code
914 for gid_check in gids:
915 if gid_check < 0:
916 raise ValueError(f"Group ID cannot be negative, got {gid_check}")
917
918 uid = None
919 if user is not None:
920 if not hasattr(os, 'setreuid'):
921 raise ValueError("The 'user' parameter is not supported on "
922 "the current platform")
923
924 elif isinstance(user, str):
925 if pwd is None:
926 raise ValueError("The user parameter cannot be a string "
927 "on systems without the pwd module")
928
929 uid = pwd.getpwnam(user).pw_uid
930 elif isinstance(user, int):
931 uid = user
932 else:
933 raise TypeError("User must be a string or an integer")
934
935 if uid < 0:
936 raise ValueError(f"User ID cannot be negative, got {uid}")
937
Antoine Pitrouc9982322011-01-04 19:07:07 +0000938 try:
Steve Dower050acae2016-09-06 20:16:17 -0700939 if p2cwrite != -1:
940 self.stdin = io.open(p2cwrite, 'wb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100941 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700942 self.stdin = io.TextIOWrapper(self.stdin, write_through=True,
Alexey Izbysheva2670562018-10-20 03:22:31 +0300943 line_buffering=line_buffering,
Steve Dower050acae2016-09-06 20:16:17 -0700944 encoding=encoding, errors=errors)
945 if c2pread != -1:
946 self.stdout = io.open(c2pread, 'rb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100947 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700948 self.stdout = io.TextIOWrapper(self.stdout,
949 encoding=encoding, errors=errors)
950 if errread != -1:
951 self.stderr = io.open(errread, 'rb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100952 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700953 self.stderr = io.TextIOWrapper(self.stderr,
954 encoding=encoding, errors=errors)
955
Antoine Pitrouc9982322011-01-04 19:07:07 +0000956 self._execute_child(args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +0300957 pass_fds, cwd, env,
Antoine Pitrouc9982322011-01-04 19:07:07 +0000958 startupinfo, creationflags, shell,
959 p2cread, p2cwrite,
960 c2pread, c2pwrite,
961 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700962 restore_signals,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -0700963 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700964 start_new_session)
Antoine Pitrouc9982322011-01-04 19:07:07 +0000965 except:
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800966 # Cleanup if the child failed starting.
967 for f in filter(None, (self.stdin, self.stdout, self.stderr)):
Antoine Pitrouc9982322011-01-04 19:07:07 +0000968 try:
969 f.close()
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200970 except OSError:
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800971 pass # Ignore EBADF or other errors.
972
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700973 if not self._closed_child_pipe_fds:
974 to_close = []
975 if stdin == PIPE:
976 to_close.append(p2cread)
977 if stdout == PIPE:
978 to_close.append(c2pwrite)
979 if stderr == PIPE:
980 to_close.append(errwrite)
981 if hasattr(self, '_devnull'):
982 to_close.append(self._devnull)
983 for fd in to_close:
984 try:
Segev Finer4d385172017-08-18 16:18:13 +0300985 if _mswindows and isinstance(fd, Handle):
986 fd.Close()
987 else:
988 os.close(fd)
Gregory P. Smith22ba31a2013-06-15 18:14:56 -0700989 except OSError:
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700990 pass
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800991
Antoine Pitrouc9982322011-01-04 19:07:07 +0000992 raise
993
Andrey Doroschenko645005e2019-11-17 17:08:31 +0300994 def __repr__(self):
995 obj_repr = (
996 f"<{self.__class__.__name__}: "
997 f"returncode: {self.returncode} args: {list(self.args)!r}>"
998 )
999 if len(obj_repr) > 80:
1000 obj_repr = obj_repr[:76] + "...>"
1001 return obj_repr
1002
Batuhan Taşkaya4dc5a9d2019-12-30 19:02:04 +03001003 def __class_getitem__(cls, type):
1004 """Provide minimal support for using this class as generic
1005 (for example in type annotations).
1006
1007 See PEP 484 and PEP 560 for more details. For example, `Popen[bytes]`
1008 is a valid expression at runtime (type argument `bytes` indicates the
1009 type used for stdout). Note, no type checking happens at runtime, but
1010 a static type checker can be used.
1011 """
1012 return cls
1013
andyclegg7fed7bd2017-10-23 03:01:19 +01001014 @property
1015 def universal_newlines(self):
1016 # universal_newlines as retained as an alias of text_mode for API
luzpaza5293b42017-11-05 07:37:50 -06001017 # compatibility. bpo-31756
andyclegg7fed7bd2017-10-23 03:01:19 +01001018 return self.text_mode
1019
1020 @universal_newlines.setter
1021 def universal_newlines(self, universal_newlines):
1022 self.text_mode = bool(universal_newlines)
1023
Steve Dower050acae2016-09-06 20:16:17 -07001024 def _translate_newlines(self, data, encoding, errors):
1025 data = data.decode(encoding, errors)
Andrew Svetlov82860712012-08-19 22:13:41 +03001026 return data.replace("\r\n", "\n").replace("\r", "\n")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001027
Brian Curtin79cdb662010-12-03 02:46:02 +00001028 def __enter__(self):
1029 return self
1030
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001031 def __exit__(self, exc_type, value, traceback):
Brian Curtin79cdb662010-12-03 02:46:02 +00001032 if self.stdout:
1033 self.stdout.close()
1034 if self.stderr:
1035 self.stderr.close()
Serhiy Storchakaab900c22015-02-28 12:43:08 +02001036 try: # Flushing a BufferedWriter may raise an error
1037 if self.stdin:
1038 self.stdin.close()
1039 finally:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001040 if exc_type == KeyboardInterrupt:
1041 # https://bugs.python.org/issue25942
1042 # In the case of a KeyboardInterrupt we assume the SIGINT
1043 # was also already sent to our child processes. We can't
1044 # block indefinitely as that is not user friendly.
1045 # If we have not already waited a brief amount of time in
1046 # an interrupted .wait() or .communicate() call, do so here
1047 # for consistency.
1048 if self._sigint_wait_secs > 0:
1049 try:
1050 self._wait(timeout=self._sigint_wait_secs)
1051 except TimeoutExpired:
1052 pass
1053 self._sigint_wait_secs = 0 # Note that this has been done.
1054 return # resume the KeyboardInterrupt
1055
Serhiy Storchakaab900c22015-02-28 12:43:08 +02001056 # Wait for the process to terminate, to avoid zombies.
1057 self.wait()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001058
Victor Stinner9505b032017-01-06 10:44:44 +01001059 def __del__(self, _maxsize=sys.maxsize, _warn=warnings.warn):
Serhiy Storchaka72e77612014-02-10 19:20:22 +02001060 if not self._child_created:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001061 # We didn't get to successfully create a child process.
1062 return
Victor Stinner5a48e212016-05-20 12:11:15 +02001063 if self.returncode is None:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001064 # Not reading subprocess exit status creates a zombie process which
Victor Stinnerc206f1e2016-06-14 16:42:59 +02001065 # is only destroyed at the parent python process exit
Victor Stinner9505b032017-01-06 10:44:44 +01001066 _warn("subprocess %s is still running" % self.pid,
1067 ResourceWarning, source=self)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001068 # In case the child hasn't been waited on, check if it's done.
Brett Cannon84df1e62010-05-14 00:33:40 +00001069 self._internal_poll(_deadstate=_maxsize)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001070 if self.returncode is None and _active is not None:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001071 # Child is still running, keep us alive until we can wait on it.
1072 _active.append(self)
1073
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001074 def _get_devnull(self):
1075 if not hasattr(self, '_devnull'):
1076 self._devnull = os.open(os.devnull, os.O_RDWR)
1077 return self._devnull
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001078
Victor Stinnera5e881d2015-01-14 17:07:59 +01001079 def _stdin_write(self, input):
1080 if input:
1081 try:
1082 self.stdin.write(input)
1083 except BrokenPipeError:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001084 pass # communicate() must ignore broken pipe errors.
Victor Stinnerd52aa312017-06-08 17:30:39 +02001085 except OSError as exc:
1086 if exc.errno == errno.EINVAL:
1087 # bpo-19612, bpo-30418: On Windows, stdin.write() fails
1088 # with EINVAL if the child process exited or if the child
1089 # process is still running but closed the pipe.
Victor Stinnera5e881d2015-01-14 17:07:59 +01001090 pass
1091 else:
1092 raise
Victor Stinnerd52aa312017-06-08 17:30:39 +02001093
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001094 try:
1095 self.stdin.close()
1096 except BrokenPipeError:
1097 pass # communicate() must ignore broken pipe errors.
Victor Stinnerd52aa312017-06-08 17:30:39 +02001098 except OSError as exc:
1099 if exc.errno == errno.EINVAL:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001100 pass
1101 else:
1102 raise
Victor Stinnera5e881d2015-01-14 17:07:59 +01001103
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001104 def communicate(self, input=None, timeout=None):
Joel Schaerer88031a92017-09-13 21:11:20 +02001105 """Interact with process: Send data to stdin and close it.
1106 Read data from stdout and stderr, until end-of-file is
1107 reached. Wait for process to terminate.
Tim Peterseba28be2005-03-28 01:08:02 +00001108
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001109 The optional "input" argument should be data to be sent to the
andyclegg7fed7bd2017-10-23 03:01:19 +01001110 child process, or None, if no data should be sent to the child.
1111 communicate() returns a tuple (stdout, stderr).
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001112
andyclegg7fed7bd2017-10-23 03:01:19 +01001113 By default, all communication is in bytes, and therefore any
1114 "input" should be bytes, and the (stdout, stderr) will be bytes.
1115 If in text mode (indicated by self.text_mode), any "input" should
1116 be a string, and (stdout, stderr) will be strings decoded
1117 according to locale encoding, or by "encoding" if set. Text mode
1118 is triggered by setting any of text, encoding, errors or
1119 universal_newlines.
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001120 """
Peter Astrand23109f02005-03-03 20:28:59 +00001121
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001122 if self._communication_started and input:
1123 raise ValueError("Cannot send input after starting communication")
1124
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001125 # Optimization: If we are not worried about timeouts, we haven't
1126 # started communicating, and we have one or zero pipes, using select()
1127 # or threads is unnecessary.
Victor Stinner7a8d0812011-04-05 13:13:08 +02001128 if (timeout is None and not self._communication_started and
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001129 [self.stdin, self.stdout, self.stderr].count(None) >= 2):
Tim Peterseba28be2005-03-28 01:08:02 +00001130 stdout = None
1131 stderr = None
Peter Astrand23109f02005-03-03 20:28:59 +00001132 if self.stdin:
Victor Stinnera5e881d2015-01-14 17:07:59 +01001133 self._stdin_write(input)
Peter Astrand23109f02005-03-03 20:28:59 +00001134 elif self.stdout:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001135 stdout = self.stdout.read()
Georg Brandlf08a9dd2008-06-10 16:57:31 +00001136 self.stdout.close()
Peter Astrand23109f02005-03-03 20:28:59 +00001137 elif self.stderr:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001138 stderr = self.stderr.read()
Georg Brandlf08a9dd2008-06-10 16:57:31 +00001139 self.stderr.close()
Peter Astrand23109f02005-03-03 20:28:59 +00001140 self.wait()
Victor Stinner7a8d0812011-04-05 13:13:08 +02001141 else:
1142 if timeout is not None:
Victor Stinner949d8c92012-05-30 13:30:32 +02001143 endtime = _time() + timeout
Victor Stinner7a8d0812011-04-05 13:13:08 +02001144 else:
1145 endtime = None
Tim Peterseba28be2005-03-28 01:08:02 +00001146
Victor Stinner7a8d0812011-04-05 13:13:08 +02001147 try:
1148 stdout, stderr = self._communicate(input, endtime, timeout)
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001149 except KeyboardInterrupt:
1150 # https://bugs.python.org/issue25942
1151 # See the detailed comment in .wait().
1152 if timeout is not None:
1153 sigint_timeout = min(self._sigint_wait_secs,
1154 self._remaining_time(endtime))
1155 else:
1156 sigint_timeout = self._sigint_wait_secs
1157 self._sigint_wait_secs = 0 # nothing else should wait.
1158 try:
1159 self._wait(timeout=sigint_timeout)
1160 except TimeoutExpired:
1161 pass
1162 raise # resume the KeyboardInterrupt
1163
Victor Stinner7a8d0812011-04-05 13:13:08 +02001164 finally:
1165 self._communication_started = True
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001166
Victor Stinner7a8d0812011-04-05 13:13:08 +02001167 sts = self.wait(timeout=self._remaining_time(endtime))
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001168
1169 return (stdout, stderr)
Peter Astrand23109f02005-03-03 20:28:59 +00001170
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001171
Georg Brandl6aa2d1f2008-08-12 08:35:52 +00001172 def poll(self):
Martin Panter4afdca02016-10-25 22:20:48 +00001173 """Check if child process has terminated. Set and return returncode
1174 attribute."""
Georg Brandl6aa2d1f2008-08-12 08:35:52 +00001175 return self._internal_poll()
1176
1177
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001178 def _remaining_time(self, endtime):
1179 """Convenience for _communicate when computing timeouts."""
1180 if endtime is None:
1181 return None
1182 else:
Victor Stinner949d8c92012-05-30 13:30:32 +02001183 return endtime - _time()
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001184
1185
Gregory P. Smith580d2782019-09-11 04:23:05 -05001186 def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq,
1187 skip_check_and_raise=False):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001188 """Convenience for checking if a timeout has expired."""
1189 if endtime is None:
1190 return
Gregory P. Smith580d2782019-09-11 04:23:05 -05001191 if skip_check_and_raise or _time() > endtime:
1192 raise TimeoutExpired(
1193 self.args, orig_timeout,
1194 output=b''.join(stdout_seq) if stdout_seq else None,
1195 stderr=b''.join(stderr_seq) if stderr_seq else None)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001196
1197
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001198 def wait(self, timeout=None):
1199 """Wait for child process to terminate; returns self.returncode."""
1200 if timeout is not None:
1201 endtime = _time() + timeout
1202 try:
1203 return self._wait(timeout=timeout)
1204 except KeyboardInterrupt:
1205 # https://bugs.python.org/issue25942
1206 # The first keyboard interrupt waits briefly for the child to
1207 # exit under the common assumption that it also received the ^C
1208 # generated SIGINT and will exit rapidly.
1209 if timeout is not None:
1210 sigint_timeout = min(self._sigint_wait_secs,
1211 self._remaining_time(endtime))
1212 else:
1213 sigint_timeout = self._sigint_wait_secs
1214 self._sigint_wait_secs = 0 # nothing else should wait.
1215 try:
1216 self._wait(timeout=sigint_timeout)
1217 except TimeoutExpired:
1218 pass
1219 raise # resume the KeyboardInterrupt
1220
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001221 def _close_pipe_fds(self,
1222 p2cread, p2cwrite,
1223 c2pread, c2pwrite,
1224 errread, errwrite):
1225 # self._devnull is not always defined.
1226 devnull_fd = getattr(self, '_devnull', None)
1227
Giampaolo Rodolabafa8482019-01-29 22:14:24 +01001228 with contextlib.ExitStack() as stack:
1229 if _mswindows:
1230 if p2cread != -1:
1231 stack.callback(p2cread.Close)
1232 if c2pwrite != -1:
1233 stack.callback(c2pwrite.Close)
1234 if errwrite != -1:
1235 stack.callback(errwrite.Close)
1236 else:
1237 if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
1238 stack.callback(os.close, p2cread)
1239 if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
1240 stack.callback(os.close, c2pwrite)
1241 if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
1242 stack.callback(os.close, errwrite)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001243
Giampaolo Rodolabafa8482019-01-29 22:14:24 +01001244 if devnull_fd is not None:
1245 stack.callback(os.close, devnull_fd)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001246
1247 # Prevent a double close of these handles/fds from __init__ on error.
1248 self._closed_child_pipe_fds = True
1249
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -07001250 if _mswindows:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001251 #
1252 # Windows methods
1253 #
1254 def _get_handles(self, stdin, stdout, stderr):
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +00001255 """Construct and return tuple with IO objects:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001256 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1257 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001258 if stdin is None and stdout is None and stderr is None:
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001259 return (-1, -1, -1, -1, -1, -1)
Tim Peterse718f612004-10-12 21:51:32 +00001260
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001261 p2cread, p2cwrite = -1, -1
1262 c2pread, c2pwrite = -1, -1
1263 errread, errwrite = -1, -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001264
Peter Astrandd38ddf42005-02-10 08:32:50 +00001265 if stdin is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001266 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001267 if p2cread is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001268 p2cread, _ = _winapi.CreatePipe(None, 0)
1269 p2cread = Handle(p2cread)
1270 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001271 elif stdin == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001272 p2cread, p2cwrite = _winapi.CreatePipe(None, 0)
1273 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001274 elif stdin == DEVNULL:
1275 p2cread = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001276 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001277 p2cread = msvcrt.get_osfhandle(stdin)
1278 else:
1279 # Assuming file-like object
1280 p2cread = msvcrt.get_osfhandle(stdin.fileno())
1281 p2cread = self._make_inheritable(p2cread)
1282
Peter Astrandd38ddf42005-02-10 08:32:50 +00001283 if stdout is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001284 c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001285 if c2pwrite is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001286 _, c2pwrite = _winapi.CreatePipe(None, 0)
1287 c2pwrite = Handle(c2pwrite)
1288 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001289 elif stdout == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001290 c2pread, c2pwrite = _winapi.CreatePipe(None, 0)
1291 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001292 elif stdout == DEVNULL:
1293 c2pwrite = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001294 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001295 c2pwrite = msvcrt.get_osfhandle(stdout)
1296 else:
1297 # Assuming file-like object
1298 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
1299 c2pwrite = self._make_inheritable(c2pwrite)
1300
Peter Astrandd38ddf42005-02-10 08:32:50 +00001301 if stderr is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001302 errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001303 if errwrite is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001304 _, errwrite = _winapi.CreatePipe(None, 0)
1305 errwrite = Handle(errwrite)
1306 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001307 elif stderr == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001308 errread, errwrite = _winapi.CreatePipe(None, 0)
1309 errread, errwrite = Handle(errread), Handle(errwrite)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001310 elif stderr == STDOUT:
1311 errwrite = c2pwrite
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001312 elif stderr == DEVNULL:
1313 errwrite = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001314 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001315 errwrite = msvcrt.get_osfhandle(stderr)
1316 else:
1317 # Assuming file-like object
1318 errwrite = msvcrt.get_osfhandle(stderr.fileno())
1319 errwrite = self._make_inheritable(errwrite)
1320
1321 return (p2cread, p2cwrite,
1322 c2pread, c2pwrite,
1323 errread, errwrite)
1324
1325
1326 def _make_inheritable(self, handle):
1327 """Return a duplicate of handle, which is inheritable"""
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001328 h = _winapi.DuplicateHandle(
1329 _winapi.GetCurrentProcess(), handle,
1330 _winapi.GetCurrentProcess(), 0, 1,
1331 _winapi.DUPLICATE_SAME_ACCESS)
1332 return Handle(h)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001333
1334
Segev Finerb2a60832017-12-18 11:28:19 +02001335 def _filter_handle_list(self, handle_list):
1336 """Filter out console handles that can't be used
1337 in lpAttributeList["handle_list"] and make sure the list
1338 isn't empty. This also removes duplicate handles."""
1339 # An handle with it's lowest two bits set might be a special console
1340 # handle that if passed in lpAttributeList["handle_list"], will
1341 # cause it to fail.
1342 return list({handle for handle in handle_list
1343 if handle & 0x3 != 0x3
1344 or _winapi.GetFileType(handle) !=
1345 _winapi.FILE_TYPE_CHAR})
1346
1347
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001348 def _execute_child(self, args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +03001349 pass_fds, cwd, env,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001350 startupinfo, creationflags, shell,
1351 p2cread, p2cwrite,
1352 c2pread, c2pwrite,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001353 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001354 unused_restore_signals,
1355 unused_gid, unused_gids, unused_uid,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001356 unused_umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001357 unused_start_new_session):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001358 """Execute program (MS Windows version)"""
1359
Gregory P. Smith8edd99d2010-12-14 13:43:30 +00001360 assert not pass_fds, "pass_fds not supported on Windows."
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +00001361
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001362 if isinstance(args, str):
1363 pass
1364 elif isinstance(args, bytes):
1365 if shell:
1366 raise TypeError('bytes args is not allowed on Windows')
1367 args = list2cmdline([args])
1368 elif isinstance(args, os.PathLike):
1369 if shell:
1370 raise TypeError('path-like args is not allowed when '
1371 'shell is true')
1372 args = list2cmdline([args])
1373 else:
Serhiy Storchakabe50a7b2018-02-28 01:03:46 +02001374 args = list2cmdline(args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001375
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001376 if executable is not None:
1377 executable = os.fsdecode(executable)
1378
Peter Astrandc1d65362004-11-07 14:30:34 +00001379 # Process startup details
Peter Astrandd38ddf42005-02-10 08:32:50 +00001380 if startupinfo is None:
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001381 startupinfo = STARTUPINFO()
Victor Stinner483422f2018-07-05 22:54:17 +02001382 else:
1383 # bpo-34044: Copy STARTUPINFO since it is modified above,
1384 # so the caller can reuse it multiple times.
1385 startupinfo = startupinfo.copy()
Segev Finerb2a60832017-12-18 11:28:19 +02001386
1387 use_std_handles = -1 not in (p2cread, c2pwrite, errwrite)
1388 if use_std_handles:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001389 startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES
Peter Astrandc1d65362004-11-07 14:30:34 +00001390 startupinfo.hStdInput = p2cread
1391 startupinfo.hStdOutput = c2pwrite
1392 startupinfo.hStdError = errwrite
1393
Segev Finerb2a60832017-12-18 11:28:19 +02001394 attribute_list = startupinfo.lpAttributeList
1395 have_handle_list = bool(attribute_list and
1396 "handle_list" in attribute_list and
1397 attribute_list["handle_list"])
1398
1399 # If we were given an handle_list or need to create one
1400 if have_handle_list or (use_std_handles and close_fds):
1401 if attribute_list is None:
1402 attribute_list = startupinfo.lpAttributeList = {}
1403 handle_list = attribute_list["handle_list"] = \
1404 list(attribute_list.get("handle_list", []))
1405
1406 if use_std_handles:
1407 handle_list += [int(p2cread), int(c2pwrite), int(errwrite)]
1408
1409 handle_list[:] = self._filter_handle_list(handle_list)
1410
1411 if handle_list:
1412 if not close_fds:
1413 warnings.warn("startupinfo.lpAttributeList['handle_list'] "
1414 "overriding close_fds", RuntimeWarning)
1415
1416 # When using the handle_list we always request to inherit
1417 # handles but the only handles that will be inherited are
1418 # the ones in the handle_list
1419 close_fds = False
1420
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001421 if shell:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001422 startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW
1423 startupinfo.wShowWindow = _winapi.SW_HIDE
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001424 comspec = os.environ.get("COMSPEC", "cmd.exe")
Tim Golden126c2962010-08-11 14:20:40 +00001425 args = '{} /c "{}"'.format (comspec, args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001426
Steve Dower60419a72019-06-24 08:42:54 -07001427 if cwd is not None:
1428 cwd = os.fsdecode(cwd)
1429
1430 sys.audit("subprocess.Popen", executable, args, cwd, env)
1431
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001432 # Start the process
1433 try:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001434 hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
Tim Peterse8374a52004-10-13 03:15:00 +00001435 # no special security
1436 None, None,
Guido van Rossume7ba4952007-06-06 23:52:48 +00001437 int(not close_fds),
Tim Peterse8374a52004-10-13 03:15:00 +00001438 creationflags,
1439 env,
Steve Dower60419a72019-06-24 08:42:54 -07001440 cwd,
Tim Peterse8374a52004-10-13 03:15:00 +00001441 startupinfo)
Tim Goldenad537f22010-08-08 11:18:16 +00001442 finally:
1443 # Child is launched. Close the parent's copy of those pipe
1444 # handles that only the child should have open. You need
1445 # to make sure that no handles to the write end of the
1446 # output pipe are maintained in this process or else the
1447 # pipe will not close when the child process exits and the
1448 # ReadFile will hang.
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001449 self._close_pipe_fds(p2cread, p2cwrite,
1450 c2pread, c2pwrite,
1451 errread, errwrite)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001452
1453 # Retain the process handle, but close the thread handle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001454 self._child_created = True
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001455 self._handle = Handle(hp)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001456 self.pid = pid
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001457 _winapi.CloseHandle(ht)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001458
Brett Cannon84df1e62010-05-14 00:33:40 +00001459 def _internal_poll(self, _deadstate=None,
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001460 _WaitForSingleObject=_winapi.WaitForSingleObject,
1461 _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0,
1462 _GetExitCodeProcess=_winapi.GetExitCodeProcess):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001463 """Check if child process has terminated. Returns returncode
Brett Cannon84df1e62010-05-14 00:33:40 +00001464 attribute.
1465
1466 This method is called by __del__, so it can only refer to objects
1467 in its local scope.
1468
1469 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001470 if self.returncode is None:
Brett Cannon84df1e62010-05-14 00:33:40 +00001471 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
1472 self.returncode = _GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001473 return self.returncode
1474
1475
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001476 def _wait(self, timeout):
1477 """Internal implementation of wait() on Windows."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001478 if timeout is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001479 timeout_millis = _winapi.INFINITE
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001480 else:
Reid Kleckner91156ff2011-03-21 10:06:10 -07001481 timeout_millis = int(timeout * 1000)
Peter Astrandd38ddf42005-02-10 08:32:50 +00001482 if self.returncode is None:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001483 # API note: Returns immediately if timeout_millis == 0.
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001484 result = _winapi.WaitForSingleObject(self._handle,
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001485 timeout_millis)
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001486 if result == _winapi.WAIT_TIMEOUT:
Reid Kleckner2b228f02011-03-16 16:57:54 -04001487 raise TimeoutExpired(self.args, timeout)
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001488 self.returncode = _winapi.GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001489 return self.returncode
1490
1491
1492 def _readerthread(self, fh, buffer):
1493 buffer.append(fh.read())
Victor Stinner667d4b52010-12-25 22:40:32 +00001494 fh.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001495
1496
Reid Kleckner2b228f02011-03-16 16:57:54 -04001497 def _communicate(self, input, endtime, orig_timeout):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001498 # Start reader threads feeding into a list hanging off of this
1499 # object, unless they've already been started.
1500 if self.stdout and not hasattr(self, "_stdout_buff"):
1501 self._stdout_buff = []
1502 self.stdout_thread = \
1503 threading.Thread(target=self._readerthread,
1504 args=(self.stdout, self._stdout_buff))
1505 self.stdout_thread.daemon = True
1506 self.stdout_thread.start()
1507 if self.stderr and not hasattr(self, "_stderr_buff"):
1508 self._stderr_buff = []
1509 self.stderr_thread = \
1510 threading.Thread(target=self._readerthread,
1511 args=(self.stderr, self._stderr_buff))
1512 self.stderr_thread.daemon = True
1513 self.stderr_thread.start()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001514
1515 if self.stdin:
Victor Stinnera5e881d2015-01-14 17:07:59 +01001516 self._stdin_write(input)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001517
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001518 # Wait for the reader threads, or time out. If we time out, the
1519 # threads remain reading and the fds left open in case the user
1520 # calls communicate again.
1521 if self.stdout is not None:
1522 self.stdout_thread.join(self._remaining_time(endtime))
Andrew Svetlov377a1522012-08-19 20:49:39 +03001523 if self.stdout_thread.is_alive():
Reid Kleckner9a67e6c2011-03-20 08:28:07 -07001524 raise TimeoutExpired(self.args, orig_timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001525 if self.stderr is not None:
1526 self.stderr_thread.join(self._remaining_time(endtime))
Andrew Svetlov377a1522012-08-19 20:49:39 +03001527 if self.stderr_thread.is_alive():
Reid Kleckner9a67e6c2011-03-20 08:28:07 -07001528 raise TimeoutExpired(self.args, orig_timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001529
1530 # Collect the output from and close both pipes, now that we know
1531 # both have been read successfully.
1532 stdout = None
1533 stderr = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001534 if self.stdout:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001535 stdout = self._stdout_buff
1536 self.stdout.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001537 if self.stderr:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001538 stderr = self._stderr_buff
1539 self.stderr.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001540
1541 # All data exchanged. Translate lists into strings.
Peter Astrandd38ddf42005-02-10 08:32:50 +00001542 if stdout is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001543 stdout = stdout[0]
Peter Astrandd38ddf42005-02-10 08:32:50 +00001544 if stderr is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001545 stderr = stderr[0]
1546
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001547 return (stdout, stderr)
1548
Christian Heimesa342c012008-04-20 21:01:16 +00001549 def send_signal(self, sig):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08001550 """Send a signal to the process."""
1551 # Don't signal a process that we know has already died.
1552 if self.returncode is not None:
1553 return
Christian Heimesa342c012008-04-20 21:01:16 +00001554 if sig == signal.SIGTERM:
1555 self.terminate()
Brian Curtineb24d742010-04-12 17:16:38 +00001556 elif sig == signal.CTRL_C_EVENT:
1557 os.kill(self.pid, signal.CTRL_C_EVENT)
1558 elif sig == signal.CTRL_BREAK_EVENT:
1559 os.kill(self.pid, signal.CTRL_BREAK_EVENT)
Christian Heimesa342c012008-04-20 21:01:16 +00001560 else:
Brian Curtin19651362010-09-07 13:24:38 +00001561 raise ValueError("Unsupported signal: {}".format(sig))
Christian Heimesa342c012008-04-20 21:01:16 +00001562
1563 def terminate(self):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08001564 """Terminates the process."""
1565 # Don't terminate a process that we know has already died.
1566 if self.returncode is not None:
1567 return
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001568 try:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001569 _winapi.TerminateProcess(self._handle, 1)
Antoine Pitroub69ef162012-03-11 19:33:29 +01001570 except PermissionError:
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001571 # ERROR_ACCESS_DENIED (winerror 5) is received when the
1572 # process already died.
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001573 rc = _winapi.GetExitCodeProcess(self._handle)
1574 if rc == _winapi.STILL_ACTIVE:
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001575 raise
1576 self.returncode = rc
Christian Heimesa342c012008-04-20 21:01:16 +00001577
1578 kill = terminate
1579
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001580 else:
1581 #
1582 # POSIX methods
1583 #
1584 def _get_handles(self, stdin, stdout, stderr):
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +00001585 """Construct and return tuple with IO objects:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001586 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1587 """
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001588 p2cread, p2cwrite = -1, -1
1589 c2pread, c2pwrite = -1, -1
1590 errread, errwrite = -1, -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001591
Peter Astrandd38ddf42005-02-10 08:32:50 +00001592 if stdin is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001593 pass
1594 elif stdin == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001595 p2cread, p2cwrite = os.pipe()
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001596 elif stdin == DEVNULL:
1597 p2cread = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001598 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001599 p2cread = stdin
1600 else:
1601 # Assuming file-like object
1602 p2cread = stdin.fileno()
1603
Peter Astrandd38ddf42005-02-10 08:32:50 +00001604 if stdout is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001605 pass
1606 elif stdout == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001607 c2pread, c2pwrite = os.pipe()
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001608 elif stdout == DEVNULL:
1609 c2pwrite = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001610 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001611 c2pwrite = stdout
1612 else:
1613 # Assuming file-like object
Tim Peterse718f612004-10-12 21:51:32 +00001614 c2pwrite = stdout.fileno()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001615
Peter Astrandd38ddf42005-02-10 08:32:50 +00001616 if stderr is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001617 pass
1618 elif stderr == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001619 errread, errwrite = os.pipe()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001620 elif stderr == STDOUT:
Martin Panterc7635892016-05-13 01:54:44 +00001621 if c2pwrite != -1:
1622 errwrite = c2pwrite
1623 else: # child's stdout is not set, use parent's stdout
1624 errwrite = sys.__stdout__.fileno()
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001625 elif stderr == DEVNULL:
1626 errwrite = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001627 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001628 errwrite = stderr
1629 else:
1630 # Assuming file-like object
1631 errwrite = stderr.fileno()
1632
1633 return (p2cread, p2cwrite,
1634 c2pread, c2pwrite,
1635 errread, errwrite)
1636
1637
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001638 def _posix_spawn(self, args, executable, env, restore_signals,
1639 p2cread, p2cwrite,
1640 c2pread, c2pwrite,
1641 errread, errwrite):
Victor Stinner8c349562019-01-16 23:38:06 +01001642 """Execute program using os.posix_spawn()."""
Victor Stinner9daecf32019-01-16 00:02:35 +01001643 if env is None:
1644 env = os.environ
1645
1646 kwargs = {}
1647 if restore_signals:
1648 # See _Py_RestoreSignals() in Python/pylifecycle.c
1649 sigset = []
1650 for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'):
1651 signum = getattr(signal, signame, None)
1652 if signum is not None:
1653 sigset.append(signum)
1654 kwargs['setsigdef'] = sigset
1655
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001656 file_actions = []
1657 for fd in (p2cwrite, c2pread, errread):
1658 if fd != -1:
1659 file_actions.append((os.POSIX_SPAWN_CLOSE, fd))
1660 for fd, fd2 in (
1661 (p2cread, 0),
1662 (c2pwrite, 1),
1663 (errwrite, 2),
1664 ):
1665 if fd != -1:
1666 file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2))
1667 if file_actions:
1668 kwargs['file_actions'] = file_actions
1669
Victor Stinner8c349562019-01-16 23:38:06 +01001670 self.pid = os.posix_spawn(executable, args, env, **kwargs)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001671 self._child_created = True
1672
1673 self._close_pipe_fds(p2cread, p2cwrite,
1674 c2pread, c2pwrite,
1675 errread, errwrite)
Victor Stinner9daecf32019-01-16 00:02:35 +01001676
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001677 def _execute_child(self, args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +03001678 pass_fds, cwd, env,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001679 startupinfo, creationflags, shell,
1680 p2cread, p2cwrite,
1681 c2pread, c2pwrite,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001682 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001683 restore_signals,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001684 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001685 start_new_session):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001686 """Execute program (POSIX version)"""
1687
Victor Stinner7b3b20a2011-03-03 12:54:05 +00001688 if isinstance(args, (str, bytes)):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001689 args = [args]
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001690 elif isinstance(args, os.PathLike):
1691 if shell:
1692 raise TypeError('path-like args is not allowed when '
1693 'shell is true')
1694 args = [args]
Thomas Wouters89f507f2006-12-13 04:49:30 +00001695 else:
Serhiy Storchakabe50a7b2018-02-28 01:03:46 +02001696 args = list(args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001697
1698 if shell:
Xavier de Gayeb35fc622016-12-13 16:32:21 +01001699 # On Android the default shell is at '/system/bin/sh'.
1700 unix_shell = ('/system/bin/sh' if
1701 hasattr(sys, 'getandroidapilevel') else '/bin/sh')
1702 args = [unix_shell, "-c"] + args
Stefan Krah9542cc62010-07-19 14:20:53 +00001703 if executable:
1704 args[0] = executable
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001705
Peter Astrandd38ddf42005-02-10 08:32:50 +00001706 if executable is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001707 executable = args[0]
Victor Stinner9daecf32019-01-16 00:02:35 +01001708
Steve Dower60419a72019-06-24 08:42:54 -07001709 sys.audit("subprocess.Popen", executable, args, cwd, env)
1710
Victor Stinner9daecf32019-01-16 00:02:35 +01001711 if (_USE_POSIX_SPAWN
Victor Stinner8c349562019-01-16 23:38:06 +01001712 and os.path.dirname(executable)
Victor Stinner9daecf32019-01-16 00:02:35 +01001713 and preexec_fn is None
1714 and not close_fds
1715 and not pass_fds
1716 and cwd is None
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001717 and (p2cread == -1 or p2cread > 2)
1718 and (c2pwrite == -1 or c2pwrite > 2)
1719 and (errwrite == -1 or errwrite > 2)
Victor Stinnerfaca8552019-09-25 15:52:49 +02001720 and not start_new_session
1721 and gid is None
1722 and gids is None
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001723 and uid is None
1724 and umask < 0):
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001725 self._posix_spawn(args, executable, env, restore_signals,
1726 p2cread, p2cwrite,
1727 c2pread, c2pwrite,
1728 errread, errwrite)
Victor Stinner9daecf32019-01-16 00:02:35 +01001729 return
1730
Gregory P. Smith5591b022012-10-10 03:34:47 -07001731 orig_executable = executable
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001732
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001733 # For transferring possible exec failure from child to parent.
1734 # Data format: "exception name:hex errno:description"
1735 # Pickle is not used; it is complex and involves memory allocation.
Victor Stinnerdaf45552013-08-28 00:53:59 +02001736 errpipe_read, errpipe_write = os.pipe()
Gregory P. Smith53dd8162013-12-01 16:03:24 -08001737 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
1738 low_fds_to_close = []
1739 while errpipe_write < 3:
1740 low_fds_to_close.append(errpipe_write)
1741 errpipe_write = os.dup(errpipe_write)
1742 for low_fd in low_fds_to_close:
1743 os.close(low_fd)
Christian Heimesfdab48e2008-01-20 09:06:41 +00001744 try:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001745 try:
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001746 # We must avoid complex work that could involve
1747 # malloc or free in the child process to avoid
1748 # potential deadlocks, thus we do all this here.
1749 # and pass it to fork_exec()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001750
Victor Stinner372b8382011-06-21 17:24:21 +02001751 if env is not None:
Serhiy Storchakad174d242017-06-23 19:39:27 +03001752 env_list = []
1753 for k, v in env.items():
1754 k = os.fsencode(k)
1755 if b'=' in k:
1756 raise ValueError("illegal environment variable name")
1757 env_list.append(k + b'=' + os.fsencode(v))
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001758 else:
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001759 env_list = None # Use execv instead of execve.
1760 executable = os.fsencode(executable)
1761 if os.path.dirname(executable):
1762 executable_list = (executable,)
1763 else:
1764 # This matches the behavior of os._execvpe().
1765 executable_list = tuple(
1766 os.path.join(os.fsencode(dir), executable)
1767 for dir in os.get_exec_path(env))
Gregory P. Smith361e30c2013-12-01 00:12:24 -08001768 fds_to_keep = set(pass_fds)
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001769 fds_to_keep.add(errpipe_write)
1770 self.pid = _posixsubprocess.fork_exec(
1771 args, executable_list,
Serhiy Storchaka66bffd12017-04-19 21:12:46 +03001772 close_fds, tuple(sorted(map(int, fds_to_keep))),
1773 cwd, env_list,
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001774 p2cread, p2cwrite, c2pread, c2pwrite,
1775 errread, errwrite,
1776 errpipe_read, errpipe_write,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001777 restore_signals, start_new_session,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001778 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001779 preexec_fn)
Charles-François Natali558639f2011-08-18 19:11:29 +02001780 self._child_created = True
Facundo Batista10706e22009-06-19 20:34:30 +00001781 finally:
1782 # be sure the FD is closed no matter what
1783 os.close(errpipe_write)
1784
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001785 self._close_pipe_fds(p2cread, p2cwrite,
1786 c2pread, c2pwrite,
1787 errread, errwrite)
Facundo Batista10706e22009-06-19 20:34:30 +00001788
1789 # Wait for exec to fail or succeed; possibly raising an
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001790 # exception (limited in size)
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001791 errpipe_data = bytearray()
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001792 while True:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001793 part = os.read(errpipe_read, 50000)
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001794 errpipe_data += part
1795 if not part or len(errpipe_data) > 50000:
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001796 break
Facundo Batista10706e22009-06-19 20:34:30 +00001797 finally:
1798 # be sure the FD is closed no matter what
1799 os.close(errpipe_read)
1800
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001801 if errpipe_data:
Gregory P. Smithe85db2b2010-12-14 14:38:00 +00001802 try:
Victor Stinnera58e2c52016-05-20 12:08:12 +02001803 pid, sts = os.waitpid(self.pid, 0)
1804 if pid == self.pid:
1805 self._handle_exitstatus(sts)
1806 else:
1807 self.returncode = sys.maxsize
Victor Stinnera5e881d2015-01-14 17:07:59 +01001808 except ChildProcessError:
1809 pass
Victor Stinnera58e2c52016-05-20 12:08:12 +02001810
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001811 try:
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001812 exception_name, hex_errno, err_msg = (
1813 errpipe_data.split(b':', 2))
Ammar Askar3fc499b2017-09-06 02:41:30 -04001814 # The encoding here should match the encoding
1815 # written in by the subprocess implementations
1816 # like _posixsubprocess
1817 err_msg = err_msg.decode()
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001818 except ValueError:
Gregory P. Smith8d07c262012-11-10 23:53:47 -08001819 exception_name = b'SubprocessError'
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001820 hex_errno = b'0'
Ammar Askar3fc499b2017-09-06 02:41:30 -04001821 err_msg = 'Bad exception data from child: {!r}'.format(
1822 bytes(errpipe_data))
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001823 child_exception_type = getattr(
1824 builtins, exception_name.decode('ascii'),
Gregory P. Smith8d07c262012-11-10 23:53:47 -08001825 SubprocessError)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001826 if issubclass(child_exception_type, OSError) and hex_errno:
Benjamin Petersonb8bc4392010-11-20 18:24:54 +00001827 errno_num = int(hex_errno, 16)
Gregory P. Smith5591b022012-10-10 03:34:47 -07001828 child_exec_never_called = (err_msg == "noexec")
1829 if child_exec_never_called:
1830 err_msg = ""
Gregory P. Smith8621bb52017-08-24 14:58:25 -07001831 # The error must be from chdir(cwd).
1832 err_filename = cwd
1833 else:
1834 err_filename = orig_executable
Benjamin Petersonb8bc4392010-11-20 18:24:54 +00001835 if errno_num != 0:
1836 err_msg = os.strerror(errno_num)
Gregory P. Smith8621bb52017-08-24 14:58:25 -07001837 raise child_exception_type(errno_num, err_msg, err_filename)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001838 raise child_exception_type(err_msg)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001839
1840
Brett Cannon84df1e62010-05-14 00:33:40 +00001841 def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED,
1842 _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED,
Gregory P. Smith50e16e32017-01-22 17:28:38 -08001843 _WEXITSTATUS=os.WEXITSTATUS, _WIFSTOPPED=os.WIFSTOPPED,
1844 _WSTOPSIG=os.WSTOPSIG):
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001845 """All callers to this function MUST hold self._waitpid_lock."""
Brett Cannon84df1e62010-05-14 00:33:40 +00001846 # This method is called (indirectly) by __del__, so it cannot
Serhiy Storchaka72e77612014-02-10 19:20:22 +02001847 # refer to anything outside of its local scope.
Brett Cannon84df1e62010-05-14 00:33:40 +00001848 if _WIFSIGNALED(sts):
1849 self.returncode = -_WTERMSIG(sts)
1850 elif _WIFEXITED(sts):
1851 self.returncode = _WEXITSTATUS(sts)
Gregory P. Smith50e16e32017-01-22 17:28:38 -08001852 elif _WIFSTOPPED(sts):
1853 self.returncode = -_WSTOPSIG(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001854 else:
1855 # Should never happen
Gregory P. Smith8d07c262012-11-10 23:53:47 -08001856 raise SubprocessError("Unknown child exit status!")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001857
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001858
Brett Cannon84df1e62010-05-14 00:33:40 +00001859 def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid,
Andrew Svetlov1d960fe2012-12-24 20:08:53 +02001860 _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001861 """Check if child process has terminated. Returns returncode
Brett Cannon84df1e62010-05-14 00:33:40 +00001862 attribute.
1863
1864 This method is called by __del__, so it cannot reference anything
1865 outside of the local scope (nor can any methods it calls).
1866
1867 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001868 if self.returncode is None:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001869 if not self._waitpid_lock.acquire(False):
1870 # Something else is busy calling waitpid. Don't allow two
1871 # at once. We know nothing yet.
1872 return None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001873 try:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001874 if self.returncode is not None:
1875 return self.returncode # Another thread waited.
Brett Cannon84df1e62010-05-14 00:33:40 +00001876 pid, sts = _waitpid(self.pid, _WNOHANG)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001877 if pid == self.pid:
1878 self._handle_exitstatus(sts)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +02001879 except OSError as e:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001880 if _deadstate is not None:
1881 self.returncode = _deadstate
Andrew Svetlov08bab072012-12-24 20:06:35 +02001882 elif e.errno == _ECHILD:
Gregory P. Smith39051712012-09-29 11:40:38 -07001883 # This happens if SIGCLD is set to be ignored or
1884 # waiting for child processes has otherwise been
1885 # disabled for our process. This child is dead, we
1886 # can't get the status.
1887 # http://bugs.python.org/issue15756
1888 self.returncode = 0
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001889 finally:
1890 self._waitpid_lock.release()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001891 return self.returncode
1892
1893
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001894 def _try_wait(self, wait_flags):
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001895 """All callers to this function MUST hold self._waitpid_lock."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001896 try:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001897 (pid, sts) = os.waitpid(self.pid, wait_flags)
Victor Stinnera5e881d2015-01-14 17:07:59 +01001898 except ChildProcessError:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001899 # This happens if SIGCLD is set to be ignored or waiting
1900 # for child processes has otherwise been disabled for our
1901 # process. This child is dead, we can't get the status.
1902 pid = self.pid
1903 sts = 0
1904 return (pid, sts)
1905
1906
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001907 def _wait(self, timeout):
1908 """Internal implementation of wait() on POSIX."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001909 if self.returncode is not None:
1910 return self.returncode
Reid Kleckner2b228f02011-03-16 16:57:54 -04001911
Gregory P. Smith82604e02016-11-20 16:31:07 -08001912 if timeout is not None:
1913 endtime = _time() + timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001914 # Enter a busy loop if we have a timeout. This busy loop was
1915 # cribbed from Lib/threading.py in Thread.wait() at r71065.
1916 delay = 0.0005 # 500 us -> initial delay of 1 ms
1917 while True:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001918 if self._waitpid_lock.acquire(False):
1919 try:
1920 if self.returncode is not None:
1921 break # Another thread waited.
1922 (pid, sts) = self._try_wait(os.WNOHANG)
1923 assert pid == self.pid or pid == 0
1924 if pid == self.pid:
1925 self._handle_exitstatus(sts)
1926 break
1927 finally:
1928 self._waitpid_lock.release()
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001929 remaining = self._remaining_time(endtime)
1930 if remaining <= 0:
Reid Kleckner2b228f02011-03-16 16:57:54 -04001931 raise TimeoutExpired(self.args, timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001932 delay = min(delay * 2, remaining, .05)
1933 time.sleep(delay)
Gregory P. Smithf328d792012-11-10 21:06:18 -08001934 else:
1935 while self.returncode is None:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001936 with self._waitpid_lock:
1937 if self.returncode is not None:
1938 break # Another thread waited.
1939 (pid, sts) = self._try_wait(0)
1940 # Check the pid and loop as waitpid has been known to
1941 # return 0 even without WNOHANG in odd situations.
1942 # http://bugs.python.org/issue14396.
1943 if pid == self.pid:
1944 self._handle_exitstatus(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001945 return self.returncode
1946
1947
Reid Kleckner2b228f02011-03-16 16:57:54 -04001948 def _communicate(self, input, endtime, orig_timeout):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001949 if self.stdin and not self._communication_started:
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001950 # Flush stdio buffer. This might block, if the user has
1951 # been writing to .stdin in an uncontrolled fashion.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001952 try:
1953 self.stdin.flush()
1954 except BrokenPipeError:
1955 pass # communicate() must ignore BrokenPipeError.
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001956 if not input:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001957 try:
1958 self.stdin.close()
1959 except BrokenPipeError:
1960 pass # communicate() must ignore BrokenPipeError.
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001961
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001962 stdout = None
1963 stderr = None
1964
1965 # Only create this mapping if we haven't already.
1966 if not self._communication_started:
1967 self._fileobj2output = {}
1968 if self.stdout:
1969 self._fileobj2output[self.stdout] = []
1970 if self.stderr:
1971 self._fileobj2output[self.stderr] = []
1972
1973 if self.stdout:
1974 stdout = self._fileobj2output[self.stdout]
1975 if self.stderr:
1976 stderr = self._fileobj2output[self.stderr]
1977
1978 self._save_input(input)
1979
Gregory P. Smith5ca129b2013-12-07 19:14:59 -08001980 if self._input:
1981 input_view = memoryview(self._input)
1982
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001983 with _PopenSelector() as selector:
1984 if self.stdin and input:
1985 selector.register(self.stdin, selectors.EVENT_WRITE)
Alex Rebertd3ae95e2020-01-22 18:28:31 -05001986 if self.stdout and not self.stdout.closed:
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001987 selector.register(self.stdout, selectors.EVENT_READ)
Alex Rebertd3ae95e2020-01-22 18:28:31 -05001988 if self.stderr and not self.stderr.closed:
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001989 selector.register(self.stderr, selectors.EVENT_READ)
1990
1991 while selector.get_map():
1992 timeout = self._remaining_time(endtime)
1993 if timeout is not None and timeout < 0:
Gregory P. Smith580d2782019-09-11 04:23:05 -05001994 self._check_timeout(endtime, orig_timeout,
1995 stdout, stderr,
1996 skip_check_and_raise=True)
1997 raise RuntimeError( # Impossible :)
1998 '_check_timeout(..., skip_check_and_raise=True) '
1999 'failed to raise TimeoutExpired.')
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002000
2001 ready = selector.select(timeout)
Gregory P. Smith580d2782019-09-11 04:23:05 -05002002 self._check_timeout(endtime, orig_timeout, stdout, stderr)
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002003
2004 # XXX Rewrite these to use non-blocking I/O on the file
2005 # objects; they are no longer using C stdio!
2006
2007 for key, events in ready:
2008 if key.fileobj is self.stdin:
Gregory P. Smith5ca129b2013-12-07 19:14:59 -08002009 chunk = input_view[self._input_offset :
2010 self._input_offset + _PIPE_BUF]
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002011 try:
2012 self._input_offset += os.write(key.fd, chunk)
Victor Stinnera5e881d2015-01-14 17:07:59 +01002013 except BrokenPipeError:
2014 selector.unregister(key.fileobj)
2015 key.fileobj.close()
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002016 else:
2017 if self._input_offset >= len(self._input):
2018 selector.unregister(key.fileobj)
2019 key.fileobj.close()
2020 elif key.fileobj in (self.stdout, self.stderr):
Gregory P. Smith7b83b182013-12-08 10:58:28 -08002021 data = os.read(key.fd, 32768)
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002022 if not data:
2023 selector.unregister(key.fileobj)
2024 key.fileobj.close()
2025 self._fileobj2output[key.fileobj].append(data)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04002026
2027 self.wait(timeout=self._remaining_time(endtime))
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002028
2029 # All data exchanged. Translate lists into strings.
2030 if stdout is not None:
2031 stdout = b''.join(stdout)
2032 if stderr is not None:
2033 stderr = b''.join(stderr)
2034
2035 # Translate newlines, if requested.
2036 # This also turns bytes into strings.
andyclegg7fed7bd2017-10-23 03:01:19 +01002037 if self.text_mode:
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002038 if stdout is not None:
2039 stdout = self._translate_newlines(stdout,
Steve Dower050acae2016-09-06 20:16:17 -07002040 self.stdout.encoding,
2041 self.stdout.errors)
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002042 if stderr is not None:
2043 stderr = self._translate_newlines(stderr,
Steve Dower050acae2016-09-06 20:16:17 -07002044 self.stderr.encoding,
2045 self.stderr.errors)
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002046
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002047 return (stdout, stderr)
2048
2049
Andrew Svetlovaa0dbdc2012-08-14 18:40:21 +03002050 def _save_input(self, input):
2051 # This method is called from the _communicate_with_*() methods
2052 # so that if we time out while communicating, we can continue
2053 # sending input if we retry.
2054 if self.stdin and self._input is None:
2055 self._input_offset = 0
2056 self._input = input
andyclegg7fed7bd2017-10-23 03:01:19 +01002057 if input is not None and self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -07002058 self._input = self._input.encode(self.stdin.encoding,
2059 self.stdin.errors)
Andrew Svetlovaa0dbdc2012-08-14 18:40:21 +03002060
2061
Christian Heimesa342c012008-04-20 21:01:16 +00002062 def send_signal(self, sig):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08002063 """Send a signal to the process."""
Victor Stinnere85a3052020-01-15 17:38:55 +01002064 # bpo-38630: Polling reduces the risk of sending a signal to the
2065 # wrong process if the process completed, the Popen.returncode
2066 # attribute is still None, and the pid has been reassigned
2067 # (recycled) to a new different process. This race condition can
2068 # happens in two cases.
2069 #
2070 # Case 1. Thread A calls Popen.poll(), thread B calls
2071 # Popen.send_signal(). In thread A, waitpid() succeed and returns
2072 # the exit status. Thread B calls kill() because poll() in thread A
2073 # did not set returncode yet. Calling poll() in thread B prevents
2074 # the race condition thanks to Popen._waitpid_lock.
2075 #
2076 # Case 2. waitpid(pid, 0) has been called directly, without
2077 # using Popen methods: returncode is still None is this case.
2078 # Calling Popen.poll() will set returncode to a default value,
2079 # since waitpid() fails with ProcessLookupError.
2080 self.poll()
2081 if self.returncode is not None:
2082 # Skip signalling a process that we know has already died.
2083 return
2084
2085 # The race condition can still happen if the race condition
2086 # described above happens between the returncode test
2087 # and the kill() call.
2088 os.kill(self.pid, sig)
Christian Heimesa342c012008-04-20 21:01:16 +00002089
2090 def terminate(self):
2091 """Terminate the process with SIGTERM
2092 """
2093 self.send_signal(signal.SIGTERM)
2094
2095 def kill(self):
2096 """Kill the process with SIGKILL
2097 """
2098 self.send_signal(signal.SIGKILL)