blob: 6a6c2fc98e83f3c527a07911ae4dcd9c4b4f2d92 [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
Guido van Rossum48b069a2020-04-07 09:50:06 -070055import types
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000056
Patrick McLean2b2ead72019-09-12 10:15:44 -070057try:
58 import pwd
59except ImportError:
60 pwd = None
61try:
62 import grp
63except ImportError:
64 grp = None
Ruben Vorderman23c0fb82020-10-20 01:30:02 +020065try:
66 import fcntl
67except ImportError:
68 fcntl = None
69
Zachary Ware880d42a2018-09-10 16:16:08 -070070
71__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput",
72 "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL",
73 "SubprocessError", "TimeoutExpired", "CompletedProcess"]
74 # NOTE: We intentionally exclude list2cmdline as it is
75 # considered an internal implementation detail. issue10838.
76
77try:
78 import msvcrt
79 import _winapi
80 _mswindows = True
81except ModuleNotFoundError:
82 _mswindows = False
83 import _posixsubprocess
84 import select
85 import selectors
86else:
87 from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
88 STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
89 STD_ERROR_HANDLE, SW_HIDE,
90 STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW,
91 ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
92 HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
93 NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
94 CREATE_NO_WINDOW, DETACHED_PROCESS,
95 CREATE_DEFAULT_ERROR_MODE, CREATE_BREAKAWAY_FROM_JOB)
96
97 __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP",
98 "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
99 "STD_ERROR_HANDLE", "SW_HIDE",
100 "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW",
101 "STARTUPINFO",
102 "ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
103 "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
104 "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS",
105 "CREATE_NO_WINDOW", "DETACHED_PROCESS",
106 "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"])
107
108
Peter Astrand454f7672005-01-01 09:36:35 +0000109# Exception classes used by this module.
Gregory P. Smith54d412e2011-03-14 14:08:43 -0400110class SubprocessError(Exception): pass
111
112
113class CalledProcessError(SubprocessError):
Martin Panter4afdca02016-10-25 22:20:48 +0000114 """Raised when run() is called with check=True and the process
115 returns a non-zero exit status.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)d6da7602016-06-03 06:14:06 +0000116
Martin Panter4afdca02016-10-25 22:20:48 +0000117 Attributes:
118 cmd, returncode, stdout, stderr, output
Georg Brandlf9734072008-12-07 15:30:06 +0000119 """
Gregory P. Smith6e730002015-04-14 16:14:25 -0700120 def __init__(self, returncode, cmd, output=None, stderr=None):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000121 self.returncode = returncode
122 self.cmd = cmd
Georg Brandlf9734072008-12-07 15:30:06 +0000123 self.output = output
Gregory P. Smith6e730002015-04-14 16:14:25 -0700124 self.stderr = stderr
125
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000126 def __str__(self):
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)d6da7602016-06-03 06:14:06 +0000127 if self.returncode and self.returncode < 0:
128 try:
129 return "Command '%s' died with %r." % (
130 self.cmd, signal.Signals(-self.returncode))
131 except ValueError:
132 return "Command '%s' died with unknown signal %d." % (
133 self.cmd, -self.returncode)
134 else:
135 return "Command '%s' returned non-zero exit status %d." % (
136 self.cmd, self.returncode)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000137
Gregory P. Smith6e730002015-04-14 16:14:25 -0700138 @property
139 def stdout(self):
140 """Alias for output attribute, to match stderr"""
141 return self.output
142
143 @stdout.setter
144 def stdout(self, value):
145 # There's no obvious reason to set this, but allow it anyway so
146 # .stdout is a transparent alias for .output
147 self.output = value
148
Peter Astrand454f7672005-01-01 09:36:35 +0000149
Gregory P. Smith54d412e2011-03-14 14:08:43 -0400150class TimeoutExpired(SubprocessError):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400151 """This exception is raised when the timeout expires while waiting for a
152 child process.
Martin Panter4afdca02016-10-25 22:20:48 +0000153
154 Attributes:
155 cmd, output, stdout, stderr, timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400156 """
Gregory P. Smith6e730002015-04-14 16:14:25 -0700157 def __init__(self, cmd, timeout, output=None, stderr=None):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400158 self.cmd = cmd
Reid Kleckner2b228f02011-03-16 16:57:54 -0400159 self.timeout = timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400160 self.output = output
Gregory P. Smith6e730002015-04-14 16:14:25 -0700161 self.stderr = stderr
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400162
163 def __str__(self):
164 return ("Command '%s' timed out after %s seconds" %
165 (self.cmd, self.timeout))
166
Gregory P. Smith6e730002015-04-14 16:14:25 -0700167 @property
168 def stdout(self):
169 return self.output
170
171 @stdout.setter
172 def stdout(self, value):
173 # There's no obvious reason to set this, but allow it anyway so
174 # .stdout is a transparent alias for .output
175 self.output = value
176
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400177
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700178if _mswindows:
Brian Curtin1ce6b582010-04-24 16:19:22 +0000179 class STARTUPINFO:
Subhendu Ghoshae160bb2017-02-25 20:29:05 +0530180 def __init__(self, *, dwFlags=0, hStdInput=None, hStdOutput=None,
Segev Finerb2a60832017-12-18 11:28:19 +0200181 hStdError=None, wShowWindow=0, lpAttributeList=None):
Subhendu Ghoshae160bb2017-02-25 20:29:05 +0530182 self.dwFlags = dwFlags
183 self.hStdInput = hStdInput
184 self.hStdOutput = hStdOutput
185 self.hStdError = hStdError
186 self.wShowWindow = wShowWindow
Segev Finerb2a60832017-12-18 11:28:19 +0200187 self.lpAttributeList = lpAttributeList or {"handle_list": []}
Victor Stinner483422f2018-07-05 22:54:17 +0200188
189 def copy(self):
190 attr_list = self.lpAttributeList.copy()
191 if 'handle_list' in attr_list:
192 attr_list['handle_list'] = list(attr_list['handle_list'])
193
194 return STARTUPINFO(dwFlags=self.dwFlags,
195 hStdInput=self.hStdInput,
196 hStdOutput=self.hStdOutput,
197 hStdError=self.hStdError,
198 wShowWindow=self.wShowWindow,
199 lpAttributeList=attr_list)
200
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200201
202 class Handle(int):
203 closed = False
204
205 def Close(self, CloseHandle=_winapi.CloseHandle):
206 if not self.closed:
207 self.closed = True
208 CloseHandle(self)
209
210 def Detach(self):
211 if not self.closed:
212 self.closed = True
213 return int(self)
214 raise ValueError("already closed")
215
216 def __repr__(self):
Serhiy Storchaka465e60e2014-07-25 23:36:00 +0300217 return "%s(%d)" % (self.__class__.__name__, int(self))
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200218
219 __del__ = Close
Zachary Ware880d42a2018-09-10 16:16:08 -0700220else:
221 # When select or poll has indicated that the file is writable,
222 # we can write up to _PIPE_BUF bytes without risk of blocking.
223 # POSIX defines PIPE_BUF as >= 512.
224 _PIPE_BUF = getattr(select, 'PIPE_BUF', 512)
225
226 # poll/select have the advantage of not requiring any extra file
227 # descriptor, contrarily to epoll/kqueue (also, they require a single
228 # syscall).
229 if hasattr(selectors, 'PollSelector'):
230 _PopenSelector = selectors.PollSelector
231 else:
232 _PopenSelector = selectors.SelectSelector
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200233
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000234
Ruslan Kuprieiev042821a2019-06-28 19:12:16 +0300235if _mswindows:
236 # On Windows we just need to close `Popen._handle` when we no longer need
237 # it, so that the kernel can free it. `Popen._handle` gets closed
238 # implicitly when the `Popen` instance is finalized (see `Handle.__del__`,
239 # which is calling `CloseHandle` as requested in [1]), so there is nothing
240 # for `_cleanup` to do.
241 #
242 # [1] https://docs.microsoft.com/en-us/windows/desktop/ProcThread/
243 # creating-processes
244 _active = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000245
Ruslan Kuprieiev042821a2019-06-28 19:12:16 +0300246 def _cleanup():
247 pass
248else:
249 # This lists holds Popen instances for which the underlying process had not
250 # exited at the time its __del__ method got called: those processes are
251 # wait()ed for synchronously from _cleanup() when a new Popen object is
252 # created, to avoid zombie processes.
253 _active = []
254
255 def _cleanup():
256 if _active is None:
257 return
258 for inst in _active[:]:
259 res = inst._internal_poll(_deadstate=sys.maxsize)
260 if res is not None:
261 try:
262 _active.remove(inst)
263 except ValueError:
264 # This can happen if two threads create a new Popen instance.
265 # It's harmless that it was already removed, so ignore.
266 pass
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000267
268PIPE = -1
269STDOUT = -2
Ross Lagerwallba102ec2011-03-16 18:40:25 +0200270DEVNULL = -3
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000271
272
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200273# XXX This function is only used by multiprocessing and the test suite,
274# but it's here so that it can be imported when Python is compiled without
275# threads.
276
Victor Stinner9def2842016-01-18 12:15:08 +0100277def _optim_args_from_interpreter_flags():
278 """Return a list of command-line arguments reproducing the current
279 optimization settings in sys.flags."""
280 args = []
281 value = sys.flags.optimize
282 if value > 0:
283 args.append('-' + 'O' * value)
284 return args
285
286
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200287def _args_from_interpreter_flags():
288 """Return a list of command-line arguments reproducing the current
Victor Stinner747f48e2017-12-12 22:59:48 +0100289 settings in sys.flags, sys.warnoptions and sys._xoptions."""
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200290 flag_opt_map = {
291 'debug': 'd',
292 # 'inspect': 'i',
293 # 'interactive': 'i',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200294 'dont_write_bytecode': 'B',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200295 'no_site': 'S',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200296 'verbose': 'v',
297 'bytes_warning': 'b',
298 'quiet': 'q',
Victor Stinner9def2842016-01-18 12:15:08 +0100299 # -O is handled in _optim_args_from_interpreter_flags()
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200300 }
Victor Stinner9def2842016-01-18 12:15:08 +0100301 args = _optim_args_from_interpreter_flags()
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200302 for flag, opt in flag_opt_map.items():
303 v = getattr(sys.flags, flag)
304 if v > 0:
305 args.append('-' + opt * v)
Victor Stinnerf39b6742017-11-20 15:24:56 -0800306
Victor Stinner9de36322018-11-23 17:54:20 +0100307 if sys.flags.isolated:
308 args.append('-I')
309 else:
310 if sys.flags.ignore_environment:
311 args.append('-E')
312 if sys.flags.no_user_site:
313 args.append('-s')
314
Victor Stinnerf39b6742017-11-20 15:24:56 -0800315 # -W options
Victor Stinner747f48e2017-12-12 22:59:48 +0100316 warnopts = sys.warnoptions[:]
317 bytes_warning = sys.flags.bytes_warning
318 xoptions = getattr(sys, '_xoptions', {})
319 dev_mode = ('dev' in xoptions)
320
321 if bytes_warning > 1:
322 warnopts.remove("error::BytesWarning")
323 elif bytes_warning:
324 warnopts.remove("default::BytesWarning")
325 if dev_mode:
326 warnopts.remove('default')
327 for opt in warnopts:
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200328 args.append('-W' + opt)
Victor Stinnerf39b6742017-11-20 15:24:56 -0800329
330 # -X options
Victor Stinner747f48e2017-12-12 22:59:48 +0100331 if dev_mode:
Victor Stinnerf39b6742017-11-20 15:24:56 -0800332 args.extend(('-X', 'dev'))
333 for opt in ('faulthandler', 'tracemalloc', 'importtime',
Pablo Galindo1ed83ad2020-06-11 17:30:46 +0100334 'showrefcount', 'utf8'):
Victor Stinnerf39b6742017-11-20 15:24:56 -0800335 if opt in xoptions:
336 value = xoptions[opt]
337 if value is True:
338 arg = opt
339 else:
340 arg = '%s=%s' % (opt, value)
341 args.extend(('-X', arg))
342
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200343 return args
344
345
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400346def call(*popenargs, timeout=None, **kwargs):
347 """Run command with arguments. Wait for command to complete or
348 timeout, then return the returncode attribute.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000349
350 The arguments are the same as for the Popen constructor. Example:
351
352 retcode = call(["ls", "-l"])
353 """
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200354 with Popen(*popenargs, **kwargs) as p:
355 try:
356 return p.wait(timeout=timeout)
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800357 except: # Including KeyboardInterrupt, wait handled that.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200358 p.kill()
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800359 # We don't call p.wait() again as p.__exit__ does that for us.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200360 raise
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000361
362
Peter Astrand454f7672005-01-01 09:36:35 +0000363def check_call(*popenargs, **kwargs):
364 """Run command with arguments. Wait for command to complete. If
365 the exit code was zero then return, otherwise raise
366 CalledProcessError. The CalledProcessError object will have the
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000367 return code in the returncode attribute.
Peter Astrand454f7672005-01-01 09:36:35 +0000368
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400369 The arguments are the same as for the call function. Example:
Peter Astrand454f7672005-01-01 09:36:35 +0000370
371 check_call(["ls", "-l"])
372 """
373 retcode = call(*popenargs, **kwargs)
Peter Astrand454f7672005-01-01 09:36:35 +0000374 if retcode:
Georg Brandlf9734072008-12-07 15:30:06 +0000375 cmd = kwargs.get("args")
376 if cmd is None:
377 cmd = popenargs[0]
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000378 raise CalledProcessError(retcode, cmd)
Georg Brandlf9734072008-12-07 15:30:06 +0000379 return 0
380
381
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400382def check_output(*popenargs, timeout=None, **kwargs):
Gregory P. Smith91110f52013-03-19 23:25:16 -0700383 r"""Run command with arguments and return its output.
Georg Brandlf9734072008-12-07 15:30:06 +0000384
385 If the exit code was non-zero it raises a CalledProcessError. The
386 CalledProcessError object will have the return code in the returncode
387 attribute and output in the output attribute.
388
389 The arguments are the same as for the Popen constructor. Example:
390
391 >>> check_output(["ls", "-l", "/dev/null"])
Georg Brandl2708f3a2009-12-20 14:38:23 +0000392 b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
Georg Brandlf9734072008-12-07 15:30:06 +0000393
394 The stdout argument is not allowed as it is used internally.
Georg Brandl127d4702009-12-28 08:10:38 +0000395 To capture standard error in the result, use stderr=STDOUT.
Georg Brandlf9734072008-12-07 15:30:06 +0000396
397 >>> check_output(["/bin/sh", "-c",
Georg Brandl2708f3a2009-12-20 14:38:23 +0000398 ... "ls -l non_existent_file ; exit 0"],
Georg Brandl127d4702009-12-28 08:10:38 +0000399 ... stderr=STDOUT)
Georg Brandl2708f3a2009-12-20 14:38:23 +0000400 b'ls: non_existent_file: No such file or directory\n'
Gregory P. Smith91110f52013-03-19 23:25:16 -0700401
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300402 There is an additional optional argument, "input", allowing you to
403 pass a string to the subprocess's stdin. If you use this argument
404 you may not also use the Popen constructor's "stdin" argument, as
405 it too will be used internally. Example:
406
407 >>> check_output(["sed", "-e", "s/foo/bar/"],
408 ... input=b"when in the course of fooman events\n")
409 b'when in the course of barman events\n'
410
andyclegg7fed7bd2017-10-23 03:01:19 +0100411 By default, all communication is in bytes, and therefore any "input"
Matthias182e1d12019-09-10 15:51:09 +0200412 should be bytes, and the return value will be bytes. If in text mode,
andyclegg7fed7bd2017-10-23 03:01:19 +0100413 any "input" should be a string, and the return value will be a string
414 decoded according to locale encoding, or by "encoding" if set. Text mode
415 is triggered by setting any of text, encoding, errors or universal_newlines.
Georg Brandlf9734072008-12-07 15:30:06 +0000416 """
417 if 'stdout' in kwargs:
418 raise ValueError('stdout argument not allowed, it will be overridden.')
Gregory P. Smith6e730002015-04-14 16:14:25 -0700419
420 if 'input' in kwargs and kwargs['input'] is None:
421 # Explicitly passing input=None was previously equivalent to passing an
422 # empty string. That is maintained here for backwards compatibility.
423 kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b''
424
425 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
426 **kwargs).stdout
427
428
429class CompletedProcess(object):
430 """A process that has finished running.
431
432 This is returned by run().
433
434 Attributes:
435 args: The list or str args passed to run().
436 returncode: The exit code of the process, negative for signals.
437 stdout: The standard output (None if not captured).
438 stderr: The standard error (None if not captured).
439 """
440 def __init__(self, args, returncode, stdout=None, stderr=None):
441 self.args = args
442 self.returncode = returncode
443 self.stdout = stdout
444 self.stderr = stderr
445
446 def __repr__(self):
447 args = ['args={!r}'.format(self.args),
448 'returncode={!r}'.format(self.returncode)]
449 if self.stdout is not None:
450 args.append('stdout={!r}'.format(self.stdout))
451 if self.stderr is not None:
452 args.append('stderr={!r}'.format(self.stderr))
453 return "{}({})".format(type(self).__name__, ', '.join(args))
454
Guido van Rossum48b069a2020-04-07 09:50:06 -0700455 __class_getitem__ = classmethod(types.GenericAlias)
Batuhan Taşkaya4dc5a9d2019-12-30 19:02:04 +0300456
457
Gregory P. Smith6e730002015-04-14 16:14:25 -0700458 def check_returncode(self):
459 """Raise CalledProcessError if the exit code is non-zero."""
460 if self.returncode:
461 raise CalledProcessError(self.returncode, self.args, self.stdout,
462 self.stderr)
463
464
Bo Baylesce0f33d2018-01-30 00:40:39 -0600465def run(*popenargs,
466 input=None, capture_output=False, timeout=None, check=False, **kwargs):
Gregory P. Smith6e730002015-04-14 16:14:25 -0700467 """Run command with arguments and return a CompletedProcess instance.
468
469 The returned instance will have attributes args, returncode, stdout and
470 stderr. By default, stdout and stderr are not captured, and those attributes
471 will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them.
472
473 If check is True and the exit code was non-zero, it raises a
474 CalledProcessError. The CalledProcessError object will have the return code
475 in the returncode attribute, and output & stderr attributes if those streams
476 were captured.
477
478 If timeout is given, and the process takes too long, a TimeoutExpired
479 exception will be raised.
480
481 There is an optional argument "input", allowing you to
andyclegg7fed7bd2017-10-23 03:01:19 +0100482 pass bytes or a string to the subprocess's stdin. If you use this argument
Gregory P. Smith6e730002015-04-14 16:14:25 -0700483 you may not also use the Popen constructor's "stdin" argument, as
484 it will be used internally.
485
andyclegg7fed7bd2017-10-23 03:01:19 +0100486 By default, all communication is in bytes, and therefore any "input" should
487 be bytes, and the stdout and stderr will be bytes. If in text mode, any
488 "input" should be a string, and stdout and stderr will be strings decoded
489 according to locale encoding, or by "encoding" if set. Text mode is
490 triggered by setting any of text, encoding, errors or universal_newlines.
Gregory P. Smith6e730002015-04-14 16:14:25 -0700491
andyclegg7fed7bd2017-10-23 03:01:19 +0100492 The other arguments are the same as for the Popen constructor.
Gregory P. Smith6e730002015-04-14 16:14:25 -0700493 """
494 if input is not None:
Rémi Lapeyre8cc605a2019-06-08 16:56:24 +0200495 if kwargs.get('stdin') is not None:
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300496 raise ValueError('stdin and input arguments may not both be used.')
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300497 kwargs['stdin'] = PIPE
Gregory P. Smith6e730002015-04-14 16:14:25 -0700498
Bo Baylesce0f33d2018-01-30 00:40:39 -0600499 if capture_output:
Rémi Lapeyre8cc605a2019-06-08 16:56:24 +0200500 if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None:
Bo Baylesce0f33d2018-01-30 00:40:39 -0600501 raise ValueError('stdout and stderr arguments may not be used '
502 'with capture_output.')
503 kwargs['stdout'] = PIPE
504 kwargs['stderr'] = PIPE
505
Gregory P. Smith6e730002015-04-14 16:14:25 -0700506 with Popen(*popenargs, **kwargs) as process:
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200507 try:
Gregory P. Smith6e730002015-04-14 16:14:25 -0700508 stdout, stderr = process.communicate(input, timeout=timeout)
Gregory P. Smith580d2782019-09-11 04:23:05 -0500509 except TimeoutExpired as exc:
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200510 process.kill()
Gregory P. Smith580d2782019-09-11 04:23:05 -0500511 if _mswindows:
512 # Windows accumulates the output in a single blocking
513 # read() call run on child threads, with the timeout
514 # being done in a join() on those threads. communicate()
515 # _after_ kill() is required to collect that and add it
516 # to the exception.
517 exc.stdout, exc.stderr = process.communicate()
518 else:
519 # POSIX _communicate already populated the output so
520 # far into the TimeoutExpired exception.
521 process.wait()
522 raise
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800523 except: # Including KeyboardInterrupt, communicate handled that.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200524 process.kill()
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800525 # We don't call process.wait() as .__exit__ does that for us.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200526 raise
527 retcode = process.poll()
Gregory P. Smith6e730002015-04-14 16:14:25 -0700528 if check and retcode:
529 raise CalledProcessError(retcode, process.args,
530 output=stdout, stderr=stderr)
531 return CompletedProcess(process.args, retcode, stdout, stderr)
Peter Astrand454f7672005-01-01 09:36:35 +0000532
533
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000534def list2cmdline(seq):
535 """
536 Translate a sequence of arguments into a command line
537 string, using the same rules as the MS C runtime:
538
539 1) Arguments are delimited by white space, which is either a
540 space or a tab.
541
542 2) A string surrounded by double quotation marks is
543 interpreted as a single argument, regardless of white space
Jean-Paul Calderone1ddd4072010-06-18 20:03:54 +0000544 contained within. A quoted string can be embedded in an
545 argument.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000546
547 3) A double quotation mark preceded by a backslash is
548 interpreted as a literal double quotation mark.
549
550 4) Backslashes are interpreted literally, unless they
551 immediately precede a double quotation mark.
552
553 5) If backslashes immediately precede a double quotation mark,
554 every pair of backslashes is interpreted as a literal
555 backslash. If the number of backslashes is odd, the last
556 backslash escapes the next double quotation mark as
557 described in rule 3.
558 """
559
560 # See
Eric Smith3c573af2009-11-09 15:23:15 +0000561 # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
562 # or search http://msdn.microsoft.com for
563 # "Parsing C++ Command-Line Arguments"
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000564 result = []
565 needquote = False
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +0300566 for arg in map(os.fsdecode, seq):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000567 bs_buf = []
568
569 # Add a space to separate this argument from the others
570 if result:
571 result.append(' ')
572
Jean-Paul Calderone1ddd4072010-06-18 20:03:54 +0000573 needquote = (" " in arg) or ("\t" in arg) or not arg
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000574 if needquote:
575 result.append('"')
576
577 for c in arg:
578 if c == '\\':
Tim Peterse718f612004-10-12 21:51:32 +0000579 # Don't know if we need to double yet.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000580 bs_buf.append(c)
581 elif c == '"':
Christian Heimesfdab48e2008-01-20 09:06:41 +0000582 # Double backslashes.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000583 result.append('\\' * len(bs_buf)*2)
584 bs_buf = []
585 result.append('\\"')
586 else:
587 # Normal char
588 if bs_buf:
589 result.extend(bs_buf)
590 bs_buf = []
591 result.append(c)
592
Christian Heimesfdab48e2008-01-20 09:06:41 +0000593 # Add remaining backslashes, if any.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000594 if bs_buf:
595 result.extend(bs_buf)
596
597 if needquote:
Peter Astrand7e78ade2005-03-03 21:10:23 +0000598 result.extend(bs_buf)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000599 result.append('"')
600
601 return ''.join(result)
602
603
Brett Cannona23810f2008-05-26 19:04:21 +0000604# Various tools for executing commands and looking at their output and status.
605#
Brett Cannona23810f2008-05-26 19:04:21 +0000606
607def getstatusoutput(cmd):
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700608 """Return (exitcode, output) of executing cmd in a shell.
Brett Cannona23810f2008-05-26 19:04:21 +0000609
Tim Golden60798142013-11-05 12:57:25 +0000610 Execute the string 'cmd' in a shell with 'check_output' and
Steve Dower050acae2016-09-06 20:16:17 -0700611 return a 2-tuple (status, output). The locale encoding is used
612 to decode the output and process newlines.
Tim Golden60798142013-11-05 12:57:25 +0000613
614 A trailing newline is stripped from the output.
615 The exit status for the command can be interpreted
616 according to the rules for the function 'wait'. Example:
Brett Cannona23810f2008-05-26 19:04:21 +0000617
618 >>> import subprocess
619 >>> subprocess.getstatusoutput('ls /bin/ls')
620 (0, '/bin/ls')
621 >>> subprocess.getstatusoutput('cat /bin/junk')
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700622 (1, 'cat: /bin/junk: No such file or directory')
Brett Cannona23810f2008-05-26 19:04:21 +0000623 >>> subprocess.getstatusoutput('/bin/junk')
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700624 (127, 'sh: /bin/junk: not found')
625 >>> subprocess.getstatusoutput('/bin/kill $$')
626 (-15, '')
Brett Cannona23810f2008-05-26 19:04:21 +0000627 """
Tim Goldene0041752013-11-03 12:53:17 +0000628 try:
andyclegg7fed7bd2017-10-23 03:01:19 +0100629 data = check_output(cmd, shell=True, text=True, stderr=STDOUT)
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700630 exitcode = 0
Tim Goldene0041752013-11-03 12:53:17 +0000631 except CalledProcessError as ex:
632 data = ex.output
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700633 exitcode = ex.returncode
Tim Goldene0041752013-11-03 12:53:17 +0000634 if data[-1:] == '\n':
635 data = data[:-1]
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700636 return exitcode, data
Brett Cannona23810f2008-05-26 19:04:21 +0000637
638def getoutput(cmd):
639 """Return output (stdout or stderr) of executing cmd in a shell.
640
641 Like getstatusoutput(), except the exit status is ignored and the return
642 value is a string containing the command's output. Example:
643
644 >>> import subprocess
645 >>> subprocess.getoutput('ls /bin/ls')
646 '/bin/ls'
647 """
648 return getstatusoutput(cmd)[1]
649
650
Victor Stinner9daecf32019-01-16 00:02:35 +0100651def _use_posix_spawn():
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800652 """Check if posix_spawn() can be used for subprocess.
Victor Stinner9daecf32019-01-16 00:02:35 +0100653
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800654 subprocess requires a posix_spawn() implementation that properly reports
655 errors to the parent process, & sets errno on the following failures:
Victor Stinner9daecf32019-01-16 00:02:35 +0100656
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800657 * Process attribute actions failed.
658 * File actions failed.
659 * exec() failed.
Victor Stinner9daecf32019-01-16 00:02:35 +0100660
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800661 Prefer an implementation which can use vfork() in some cases for best
662 performance.
Victor Stinner9daecf32019-01-16 00:02:35 +0100663 """
664 if _mswindows or not hasattr(os, 'posix_spawn'):
665 # os.posix_spawn() is not available
666 return False
667
668 if sys.platform == 'darwin':
669 # posix_spawn() is a syscall on macOS and properly reports errors
670 return True
671
672 # Check libc name and runtime libc version
673 try:
674 ver = os.confstr('CS_GNU_LIBC_VERSION')
675 # parse 'glibc 2.28' as ('glibc', (2, 28))
676 parts = ver.split(maxsplit=1)
677 if len(parts) != 2:
678 # reject unknown format
679 raise ValueError
680 libc = parts[0]
681 version = tuple(map(int, parts[1].split('.')))
682
683 if sys.platform == 'linux' and libc == 'glibc' and version >= (2, 24):
684 # glibc 2.24 has a new Linux posix_spawn implementation using vfork
685 # which properly reports errors to the parent process.
686 return True
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800687 # Note: Don't use the implementation in earlier glibc because it doesn't
Victor Stinner9daecf32019-01-16 00:02:35 +0100688 # use vfork (even if glibc 2.26 added a pipe to properly report errors
689 # to the parent process).
690 except (AttributeError, ValueError, OSError):
691 # os.confstr() or CS_GNU_LIBC_VERSION value not available
692 pass
693
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800694 # By default, assume that posix_spawn() does not properly report errors.
Victor Stinner9daecf32019-01-16 00:02:35 +0100695 return False
696
697
698_USE_POSIX_SPAWN = _use_posix_spawn()
699
700
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000701class Popen(object):
Martin Panter4afdca02016-10-25 22:20:48 +0000702 """ Execute a child program in a new process.
Serhiy Storchaka72e77612014-02-10 19:20:22 +0200703
Martin Panter4afdca02016-10-25 22:20:48 +0000704 For a complete description of the arguments see the Python documentation.
705
706 Arguments:
707 args: A string, or a sequence of program arguments.
708
709 bufsize: supplied as the buffering argument to the open() function when
710 creating the stdin/stdout/stderr pipe file objects
711
712 executable: A replacement program to execute.
713
714 stdin, stdout and stderr: These specify the executed programs' standard
715 input, standard output and standard error file handles, respectively.
716
717 preexec_fn: (POSIX only) An object to be called in the child process
718 just before the child is executed.
719
720 close_fds: Controls closing or inheriting of file descriptors.
721
722 shell: If true, the command will be executed through the shell.
723
724 cwd: Sets the current directory before the child is executed.
725
726 env: Defines the environment variables for the new process.
727
andyclegg7fed7bd2017-10-23 03:01:19 +0100728 text: If true, decode stdin, stdout and stderr using the given encoding
729 (if set) or the system default otherwise.
730
731 universal_newlines: Alias of text, provided for backwards compatibility.
Martin Panter4afdca02016-10-25 22:20:48 +0000732
733 startupinfo and creationflags (Windows only)
734
735 restore_signals (POSIX only)
736
737 start_new_session (POSIX only)
738
Patrick McLean2b2ead72019-09-12 10:15:44 -0700739 group (POSIX only)
740
741 extra_groups (POSIX only)
742
743 user (POSIX only)
744
Gregory P. Smithf3751ef2019-10-12 13:24:56 -0700745 umask (POSIX only)
746
Martin Panter4afdca02016-10-25 22:20:48 +0000747 pass_fds (POSIX only)
748
Martin Panter3dca6242016-10-25 23:41:42 +0000749 encoding and errors: Text mode encoding and error handling to use for
750 file objects stdin, stdout and stderr.
751
Martin Panter4afdca02016-10-25 22:20:48 +0000752 Attributes:
753 stdin, stdout, stderr, pid, returncode
754 """
Serhiy Storchaka72e77612014-02-10 19:20:22 +0200755 _child_created = False # Set here since __del__ checks it
756
Gregory P. Smitha1ed5392013-03-23 11:44:25 -0700757 def __init__(self, args, bufsize=-1, executable=None,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000758 stdin=None, stdout=None, stderr=None,
Segev Finerb2a60832017-12-18 11:28:19 +0200759 preexec_fn=None, close_fds=True,
andyclegg7fed7bd2017-10-23 03:01:19 +0100760 shell=False, cwd=None, env=None, universal_newlines=None,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000761 startupinfo=None, creationflags=0,
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000762 restore_signals=True, start_new_session=False,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700763 pass_fds=(), *, user=None, group=None, extra_groups=None,
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200764 encoding=None, errors=None, text=None, umask=-1, pipesize=-1):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000765 """Create new Popen instance."""
766 _cleanup()
Gregory P. Smithd65ba512014-04-23 00:27:17 -0700767 # Held while anything is calling waitpid before returncode has been
768 # updated to prevent clobbering returncode if wait() or poll() are
769 # called from multiple threads at once. After acquiring the lock,
770 # code must re-check self.returncode to see if another thread just
771 # finished a waitpid() call.
772 self._waitpid_lock = threading.Lock()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000773
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400774 self._input = None
775 self._communication_started = False
Guido van Rossum46a05a72007-06-07 21:56:45 +0000776 if bufsize is None:
Gregory P. Smitha1ed5392013-03-23 11:44:25 -0700777 bufsize = -1 # Restore default
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000778 if not isinstance(bufsize, int):
Peter Astrand738131d2004-11-30 21:04:45 +0000779 raise TypeError("bufsize must be an integer")
780
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200781 if pipesize is None:
782 pipesize = -1 # Restore default
783 if not isinstance(pipesize, int):
784 raise TypeError("pipesize must be an integer")
785
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700786 if _mswindows:
Tim Peterse8374a52004-10-13 03:15:00 +0000787 if preexec_fn is not None:
788 raise ValueError("preexec_fn is not supported on Windows "
789 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000790 else:
791 # POSIX
Gregory P. Smith8edd99d2010-12-14 13:43:30 +0000792 if pass_fds and not close_fds:
793 warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
794 close_fds = True
Tim Peterse8374a52004-10-13 03:15:00 +0000795 if startupinfo is not None:
796 raise ValueError("startupinfo is only supported on Windows "
797 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000798 if creationflags != 0:
Tim Peterse8374a52004-10-13 03:15:00 +0000799 raise ValueError("creationflags is only supported on Windows "
800 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000801
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400802 self.args = args
Tim Peterse718f612004-10-12 21:51:32 +0000803 self.stdin = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000804 self.stdout = None
805 self.stderr = None
806 self.pid = None
807 self.returncode = None
Steve Dower050acae2016-09-06 20:16:17 -0700808 self.encoding = encoding
809 self.errors = errors
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200810 self.pipesize = pipesize
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000811
andyclegg7fed7bd2017-10-23 03:01:19 +0100812 # Validate the combinations of text and universal_newlines
813 if (text is not None and universal_newlines is not None
814 and bool(universal_newlines) != bool(text)):
815 raise SubprocessError('Cannot disambiguate when both text '
816 'and universal_newlines are supplied but '
817 'different. Pass one or the other.')
818
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000819 # Input and output objects. The general principle is like
820 # this:
821 #
822 # Parent Child
823 # ------ -----
824 # p2cwrite ---stdin---> p2cread
825 # c2pread <--stdout--- c2pwrite
826 # errread <--stderr--- errwrite
827 #
828 # On POSIX, the child objects are file descriptors. On
829 # Windows, these are Windows file handles. The parent objects
830 # are file descriptors on both platforms. The parent objects
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000831 # are -1 when not using PIPEs. The child objects are -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000832 # when not redirecting.
Tim Peterse718f612004-10-12 21:51:32 +0000833
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000834 (p2cread, p2cwrite,
835 c2pread, c2pwrite,
836 errread, errwrite) = self._get_handles(stdin, stdout, stderr)
837
Antoine Pitrouc9982322011-01-04 19:07:07 +0000838 # We wrap OS handles *before* launching the child, otherwise a
839 # quickly terminating child could make our fds unwrappable
840 # (see #8458).
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000841
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700842 if _mswindows:
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000843 if p2cwrite != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000844 p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000845 if c2pread != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000846 c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000847 if errread != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000848 errread = msvcrt.open_osfhandle(errread.Detach(), 0)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000849
andyclegg7fed7bd2017-10-23 03:01:19 +0100850 self.text_mode = encoding or errors or text or universal_newlines
Tim Peterse718f612004-10-12 21:51:32 +0000851
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800852 # How long to resume waiting on a child after the first ^C.
853 # There is no right value for this. The purpose is to be polite
854 # yet remain good for interactive users trying to exit a tool.
855 self._sigint_wait_secs = 0.25 # 1/xkcd221.getRandomNumber()
856
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700857 self._closed_child_pipe_fds = False
Steve Dower050acae2016-09-06 20:16:17 -0700858
Alexey Izbysheva2670562018-10-20 03:22:31 +0300859 if self.text_mode:
860 if bufsize == 1:
861 line_buffering = True
862 # Use the default buffer size for the underlying binary streams
863 # since they don't support line buffering.
864 bufsize = -1
865 else:
866 line_buffering = False
867
Patrick McLean2b2ead72019-09-12 10:15:44 -0700868 gid = None
869 if group is not None:
870 if not hasattr(os, 'setregid'):
871 raise ValueError("The 'group' parameter is not supported on the "
872 "current platform")
873
874 elif isinstance(group, str):
875 if grp is None:
876 raise ValueError("The group parameter cannot be a string "
877 "on systems without the grp module")
878
879 gid = grp.getgrnam(group).gr_gid
880 elif isinstance(group, int):
881 gid = group
882 else:
883 raise TypeError("Group must be a string or an integer, not {}"
884 .format(type(group)))
885
886 if gid < 0:
887 raise ValueError(f"Group ID cannot be negative, got {gid}")
888
889 gids = None
890 if extra_groups is not None:
891 if not hasattr(os, 'setgroups'):
892 raise ValueError("The 'extra_groups' parameter is not "
893 "supported on the current platform")
894
895 elif isinstance(extra_groups, str):
896 raise ValueError("Groups must be a list, not a string")
897
898 gids = []
899 for extra_group in extra_groups:
900 if isinstance(extra_group, str):
901 if grp is None:
902 raise ValueError("Items in extra_groups cannot be "
903 "strings on systems without the "
904 "grp module")
905
906 gids.append(grp.getgrnam(extra_group).gr_gid)
907 elif isinstance(extra_group, int):
908 gids.append(extra_group)
909 else:
910 raise TypeError("Items in extra_groups must be a string "
911 "or integer, not {}"
912 .format(type(extra_group)))
913
914 # make sure that the gids are all positive here so we can do less
915 # checking in the C code
916 for gid_check in gids:
917 if gid_check < 0:
918 raise ValueError(f"Group ID cannot be negative, got {gid_check}")
919
920 uid = None
921 if user is not None:
922 if not hasattr(os, 'setreuid'):
923 raise ValueError("The 'user' parameter is not supported on "
924 "the current platform")
925
926 elif isinstance(user, str):
927 if pwd is None:
928 raise ValueError("The user parameter cannot be a string "
929 "on systems without the pwd module")
930
931 uid = pwd.getpwnam(user).pw_uid
932 elif isinstance(user, int):
933 uid = user
934 else:
935 raise TypeError("User must be a string or an integer")
936
937 if uid < 0:
938 raise ValueError(f"User ID cannot be negative, got {uid}")
939
Antoine Pitrouc9982322011-01-04 19:07:07 +0000940 try:
Steve Dower050acae2016-09-06 20:16:17 -0700941 if p2cwrite != -1:
942 self.stdin = io.open(p2cwrite, 'wb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100943 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700944 self.stdin = io.TextIOWrapper(self.stdin, write_through=True,
Alexey Izbysheva2670562018-10-20 03:22:31 +0300945 line_buffering=line_buffering,
Steve Dower050acae2016-09-06 20:16:17 -0700946 encoding=encoding, errors=errors)
947 if c2pread != -1:
948 self.stdout = io.open(c2pread, 'rb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100949 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700950 self.stdout = io.TextIOWrapper(self.stdout,
951 encoding=encoding, errors=errors)
952 if errread != -1:
953 self.stderr = io.open(errread, 'rb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100954 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700955 self.stderr = io.TextIOWrapper(self.stderr,
956 encoding=encoding, errors=errors)
957
Antoine Pitrouc9982322011-01-04 19:07:07 +0000958 self._execute_child(args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +0300959 pass_fds, cwd, env,
Antoine Pitrouc9982322011-01-04 19:07:07 +0000960 startupinfo, creationflags, shell,
961 p2cread, p2cwrite,
962 c2pread, c2pwrite,
963 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700964 restore_signals,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -0700965 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700966 start_new_session)
Antoine Pitrouc9982322011-01-04 19:07:07 +0000967 except:
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800968 # Cleanup if the child failed starting.
969 for f in filter(None, (self.stdin, self.stdout, self.stderr)):
Antoine Pitrouc9982322011-01-04 19:07:07 +0000970 try:
971 f.close()
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200972 except OSError:
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800973 pass # Ignore EBADF or other errors.
974
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700975 if not self._closed_child_pipe_fds:
976 to_close = []
977 if stdin == PIPE:
978 to_close.append(p2cread)
979 if stdout == PIPE:
980 to_close.append(c2pwrite)
981 if stderr == PIPE:
982 to_close.append(errwrite)
983 if hasattr(self, '_devnull'):
984 to_close.append(self._devnull)
985 for fd in to_close:
986 try:
Segev Finer4d385172017-08-18 16:18:13 +0300987 if _mswindows and isinstance(fd, Handle):
988 fd.Close()
989 else:
990 os.close(fd)
Gregory P. Smith22ba31a2013-06-15 18:14:56 -0700991 except OSError:
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700992 pass
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800993
Antoine Pitrouc9982322011-01-04 19:07:07 +0000994 raise
995
Andrey Doroschenko645005e2019-11-17 17:08:31 +0300996 def __repr__(self):
997 obj_repr = (
998 f"<{self.__class__.__name__}: "
999 f"returncode: {self.returncode} args: {list(self.args)!r}>"
1000 )
1001 if len(obj_repr) > 80:
1002 obj_repr = obj_repr[:76] + "...>"
1003 return obj_repr
1004
Guido van Rossum48b069a2020-04-07 09:50:06 -07001005 __class_getitem__ = classmethod(types.GenericAlias)
Batuhan Taşkaya4dc5a9d2019-12-30 19:02:04 +03001006
andyclegg7fed7bd2017-10-23 03:01:19 +01001007 @property
1008 def universal_newlines(self):
1009 # universal_newlines as retained as an alias of text_mode for API
luzpaza5293b42017-11-05 07:37:50 -06001010 # compatibility. bpo-31756
andyclegg7fed7bd2017-10-23 03:01:19 +01001011 return self.text_mode
1012
1013 @universal_newlines.setter
1014 def universal_newlines(self, universal_newlines):
1015 self.text_mode = bool(universal_newlines)
1016
Steve Dower050acae2016-09-06 20:16:17 -07001017 def _translate_newlines(self, data, encoding, errors):
1018 data = data.decode(encoding, errors)
Andrew Svetlov82860712012-08-19 22:13:41 +03001019 return data.replace("\r\n", "\n").replace("\r", "\n")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001020
Brian Curtin79cdb662010-12-03 02:46:02 +00001021 def __enter__(self):
1022 return self
1023
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001024 def __exit__(self, exc_type, value, traceback):
Brian Curtin79cdb662010-12-03 02:46:02 +00001025 if self.stdout:
1026 self.stdout.close()
1027 if self.stderr:
1028 self.stderr.close()
Serhiy Storchakaab900c22015-02-28 12:43:08 +02001029 try: # Flushing a BufferedWriter may raise an error
1030 if self.stdin:
1031 self.stdin.close()
1032 finally:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001033 if exc_type == KeyboardInterrupt:
1034 # https://bugs.python.org/issue25942
1035 # In the case of a KeyboardInterrupt we assume the SIGINT
1036 # was also already sent to our child processes. We can't
1037 # block indefinitely as that is not user friendly.
1038 # If we have not already waited a brief amount of time in
1039 # an interrupted .wait() or .communicate() call, do so here
1040 # for consistency.
1041 if self._sigint_wait_secs > 0:
1042 try:
1043 self._wait(timeout=self._sigint_wait_secs)
1044 except TimeoutExpired:
1045 pass
1046 self._sigint_wait_secs = 0 # Note that this has been done.
1047 return # resume the KeyboardInterrupt
1048
Serhiy Storchakaab900c22015-02-28 12:43:08 +02001049 # Wait for the process to terminate, to avoid zombies.
1050 self.wait()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001051
Victor Stinner9505b032017-01-06 10:44:44 +01001052 def __del__(self, _maxsize=sys.maxsize, _warn=warnings.warn):
Serhiy Storchaka72e77612014-02-10 19:20:22 +02001053 if not self._child_created:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001054 # We didn't get to successfully create a child process.
1055 return
Victor Stinner5a48e212016-05-20 12:11:15 +02001056 if self.returncode is None:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001057 # Not reading subprocess exit status creates a zombie process which
Victor Stinnerc206f1e2016-06-14 16:42:59 +02001058 # is only destroyed at the parent python process exit
Victor Stinner9505b032017-01-06 10:44:44 +01001059 _warn("subprocess %s is still running" % self.pid,
1060 ResourceWarning, source=self)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001061 # In case the child hasn't been waited on, check if it's done.
Brett Cannon84df1e62010-05-14 00:33:40 +00001062 self._internal_poll(_deadstate=_maxsize)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001063 if self.returncode is None and _active is not None:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001064 # Child is still running, keep us alive until we can wait on it.
1065 _active.append(self)
1066
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001067 def _get_devnull(self):
1068 if not hasattr(self, '_devnull'):
1069 self._devnull = os.open(os.devnull, os.O_RDWR)
1070 return self._devnull
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001071
Victor Stinnera5e881d2015-01-14 17:07:59 +01001072 def _stdin_write(self, input):
1073 if input:
1074 try:
1075 self.stdin.write(input)
1076 except BrokenPipeError:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001077 pass # communicate() must ignore broken pipe errors.
Victor Stinnerd52aa312017-06-08 17:30:39 +02001078 except OSError as exc:
1079 if exc.errno == errno.EINVAL:
1080 # bpo-19612, bpo-30418: On Windows, stdin.write() fails
1081 # with EINVAL if the child process exited or if the child
1082 # process is still running but closed the pipe.
Victor Stinnera5e881d2015-01-14 17:07:59 +01001083 pass
1084 else:
1085 raise
Victor Stinnerd52aa312017-06-08 17:30:39 +02001086
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001087 try:
1088 self.stdin.close()
1089 except BrokenPipeError:
1090 pass # communicate() must ignore broken pipe errors.
Victor Stinnerd52aa312017-06-08 17:30:39 +02001091 except OSError as exc:
1092 if exc.errno == errno.EINVAL:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001093 pass
1094 else:
1095 raise
Victor Stinnera5e881d2015-01-14 17:07:59 +01001096
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001097 def communicate(self, input=None, timeout=None):
Joel Schaerer88031a92017-09-13 21:11:20 +02001098 """Interact with process: Send data to stdin and close it.
1099 Read data from stdout and stderr, until end-of-file is
1100 reached. Wait for process to terminate.
Tim Peterseba28be2005-03-28 01:08:02 +00001101
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001102 The optional "input" argument should be data to be sent to the
andyclegg7fed7bd2017-10-23 03:01:19 +01001103 child process, or None, if no data should be sent to the child.
1104 communicate() returns a tuple (stdout, stderr).
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001105
andyclegg7fed7bd2017-10-23 03:01:19 +01001106 By default, all communication is in bytes, and therefore any
1107 "input" should be bytes, and the (stdout, stderr) will be bytes.
1108 If in text mode (indicated by self.text_mode), any "input" should
1109 be a string, and (stdout, stderr) will be strings decoded
1110 according to locale encoding, or by "encoding" if set. Text mode
1111 is triggered by setting any of text, encoding, errors or
1112 universal_newlines.
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001113 """
Peter Astrand23109f02005-03-03 20:28:59 +00001114
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001115 if self._communication_started and input:
1116 raise ValueError("Cannot send input after starting communication")
1117
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001118 # Optimization: If we are not worried about timeouts, we haven't
1119 # started communicating, and we have one or zero pipes, using select()
1120 # or threads is unnecessary.
Victor Stinner7a8d0812011-04-05 13:13:08 +02001121 if (timeout is None and not self._communication_started and
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001122 [self.stdin, self.stdout, self.stderr].count(None) >= 2):
Tim Peterseba28be2005-03-28 01:08:02 +00001123 stdout = None
1124 stderr = None
Peter Astrand23109f02005-03-03 20:28:59 +00001125 if self.stdin:
Victor Stinnera5e881d2015-01-14 17:07:59 +01001126 self._stdin_write(input)
Peter Astrand23109f02005-03-03 20:28:59 +00001127 elif self.stdout:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001128 stdout = self.stdout.read()
Georg Brandlf08a9dd2008-06-10 16:57:31 +00001129 self.stdout.close()
Peter Astrand23109f02005-03-03 20:28:59 +00001130 elif self.stderr:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001131 stderr = self.stderr.read()
Georg Brandlf08a9dd2008-06-10 16:57:31 +00001132 self.stderr.close()
Peter Astrand23109f02005-03-03 20:28:59 +00001133 self.wait()
Victor Stinner7a8d0812011-04-05 13:13:08 +02001134 else:
1135 if timeout is not None:
Victor Stinner949d8c92012-05-30 13:30:32 +02001136 endtime = _time() + timeout
Victor Stinner7a8d0812011-04-05 13:13:08 +02001137 else:
1138 endtime = None
Tim Peterseba28be2005-03-28 01:08:02 +00001139
Victor Stinner7a8d0812011-04-05 13:13:08 +02001140 try:
1141 stdout, stderr = self._communicate(input, endtime, timeout)
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001142 except KeyboardInterrupt:
1143 # https://bugs.python.org/issue25942
1144 # See the detailed comment in .wait().
1145 if timeout is not None:
1146 sigint_timeout = min(self._sigint_wait_secs,
1147 self._remaining_time(endtime))
1148 else:
1149 sigint_timeout = self._sigint_wait_secs
1150 self._sigint_wait_secs = 0 # nothing else should wait.
1151 try:
1152 self._wait(timeout=sigint_timeout)
1153 except TimeoutExpired:
1154 pass
1155 raise # resume the KeyboardInterrupt
1156
Victor Stinner7a8d0812011-04-05 13:13:08 +02001157 finally:
1158 self._communication_started = True
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001159
Victor Stinner7a8d0812011-04-05 13:13:08 +02001160 sts = self.wait(timeout=self._remaining_time(endtime))
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001161
1162 return (stdout, stderr)
Peter Astrand23109f02005-03-03 20:28:59 +00001163
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001164
Georg Brandl6aa2d1f2008-08-12 08:35:52 +00001165 def poll(self):
Martin Panter4afdca02016-10-25 22:20:48 +00001166 """Check if child process has terminated. Set and return returncode
1167 attribute."""
Georg Brandl6aa2d1f2008-08-12 08:35:52 +00001168 return self._internal_poll()
1169
1170
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001171 def _remaining_time(self, endtime):
1172 """Convenience for _communicate when computing timeouts."""
1173 if endtime is None:
1174 return None
1175 else:
Victor Stinner949d8c92012-05-30 13:30:32 +02001176 return endtime - _time()
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001177
1178
Gregory P. Smith580d2782019-09-11 04:23:05 -05001179 def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq,
1180 skip_check_and_raise=False):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001181 """Convenience for checking if a timeout has expired."""
1182 if endtime is None:
1183 return
Gregory P. Smith580d2782019-09-11 04:23:05 -05001184 if skip_check_and_raise or _time() > endtime:
1185 raise TimeoutExpired(
1186 self.args, orig_timeout,
1187 output=b''.join(stdout_seq) if stdout_seq else None,
1188 stderr=b''.join(stderr_seq) if stderr_seq else None)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001189
1190
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001191 def wait(self, timeout=None):
1192 """Wait for child process to terminate; returns self.returncode."""
1193 if timeout is not None:
1194 endtime = _time() + timeout
1195 try:
1196 return self._wait(timeout=timeout)
1197 except KeyboardInterrupt:
1198 # https://bugs.python.org/issue25942
1199 # The first keyboard interrupt waits briefly for the child to
1200 # exit under the common assumption that it also received the ^C
1201 # generated SIGINT and will exit rapidly.
1202 if timeout is not None:
1203 sigint_timeout = min(self._sigint_wait_secs,
1204 self._remaining_time(endtime))
1205 else:
1206 sigint_timeout = self._sigint_wait_secs
1207 self._sigint_wait_secs = 0 # nothing else should wait.
1208 try:
1209 self._wait(timeout=sigint_timeout)
1210 except TimeoutExpired:
1211 pass
1212 raise # resume the KeyboardInterrupt
1213
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001214 def _close_pipe_fds(self,
1215 p2cread, p2cwrite,
1216 c2pread, c2pwrite,
1217 errread, errwrite):
1218 # self._devnull is not always defined.
1219 devnull_fd = getattr(self, '_devnull', None)
1220
Giampaolo Rodolabafa8482019-01-29 22:14:24 +01001221 with contextlib.ExitStack() as stack:
1222 if _mswindows:
1223 if p2cread != -1:
1224 stack.callback(p2cread.Close)
1225 if c2pwrite != -1:
1226 stack.callback(c2pwrite.Close)
1227 if errwrite != -1:
1228 stack.callback(errwrite.Close)
1229 else:
1230 if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
1231 stack.callback(os.close, p2cread)
1232 if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
1233 stack.callback(os.close, c2pwrite)
1234 if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
1235 stack.callback(os.close, errwrite)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001236
Giampaolo Rodolabafa8482019-01-29 22:14:24 +01001237 if devnull_fd is not None:
1238 stack.callback(os.close, devnull_fd)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001239
1240 # Prevent a double close of these handles/fds from __init__ on error.
1241 self._closed_child_pipe_fds = True
1242
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -07001243 if _mswindows:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001244 #
1245 # Windows methods
1246 #
1247 def _get_handles(self, stdin, stdout, stderr):
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +00001248 """Construct and return tuple with IO objects:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001249 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1250 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001251 if stdin is None and stdout is None and stderr is None:
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001252 return (-1, -1, -1, -1, -1, -1)
Tim Peterse718f612004-10-12 21:51:32 +00001253
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001254 p2cread, p2cwrite = -1, -1
1255 c2pread, c2pwrite = -1, -1
1256 errread, errwrite = -1, -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001257
Peter Astrandd38ddf42005-02-10 08:32:50 +00001258 if stdin is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001259 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001260 if p2cread is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001261 p2cread, _ = _winapi.CreatePipe(None, 0)
1262 p2cread = Handle(p2cread)
1263 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001264 elif stdin == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001265 p2cread, p2cwrite = _winapi.CreatePipe(None, 0)
1266 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001267 elif stdin == DEVNULL:
1268 p2cread = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001269 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001270 p2cread = msvcrt.get_osfhandle(stdin)
1271 else:
1272 # Assuming file-like object
1273 p2cread = msvcrt.get_osfhandle(stdin.fileno())
1274 p2cread = self._make_inheritable(p2cread)
1275
Peter Astrandd38ddf42005-02-10 08:32:50 +00001276 if stdout is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001277 c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001278 if c2pwrite is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001279 _, c2pwrite = _winapi.CreatePipe(None, 0)
1280 c2pwrite = Handle(c2pwrite)
1281 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001282 elif stdout == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001283 c2pread, c2pwrite = _winapi.CreatePipe(None, 0)
1284 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001285 elif stdout == DEVNULL:
1286 c2pwrite = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001287 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001288 c2pwrite = msvcrt.get_osfhandle(stdout)
1289 else:
1290 # Assuming file-like object
1291 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
1292 c2pwrite = self._make_inheritable(c2pwrite)
1293
Peter Astrandd38ddf42005-02-10 08:32:50 +00001294 if stderr is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001295 errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001296 if errwrite is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001297 _, errwrite = _winapi.CreatePipe(None, 0)
1298 errwrite = Handle(errwrite)
1299 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001300 elif stderr == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001301 errread, errwrite = _winapi.CreatePipe(None, 0)
1302 errread, errwrite = Handle(errread), Handle(errwrite)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001303 elif stderr == STDOUT:
1304 errwrite = c2pwrite
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001305 elif stderr == DEVNULL:
1306 errwrite = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001307 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001308 errwrite = msvcrt.get_osfhandle(stderr)
1309 else:
1310 # Assuming file-like object
1311 errwrite = msvcrt.get_osfhandle(stderr.fileno())
1312 errwrite = self._make_inheritable(errwrite)
1313
1314 return (p2cread, p2cwrite,
1315 c2pread, c2pwrite,
1316 errread, errwrite)
1317
1318
1319 def _make_inheritable(self, handle):
1320 """Return a duplicate of handle, which is inheritable"""
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001321 h = _winapi.DuplicateHandle(
1322 _winapi.GetCurrentProcess(), handle,
1323 _winapi.GetCurrentProcess(), 0, 1,
1324 _winapi.DUPLICATE_SAME_ACCESS)
1325 return Handle(h)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001326
1327
Segev Finerb2a60832017-12-18 11:28:19 +02001328 def _filter_handle_list(self, handle_list):
1329 """Filter out console handles that can't be used
1330 in lpAttributeList["handle_list"] and make sure the list
1331 isn't empty. This also removes duplicate handles."""
1332 # An handle with it's lowest two bits set might be a special console
1333 # handle that if passed in lpAttributeList["handle_list"], will
1334 # cause it to fail.
1335 return list({handle for handle in handle_list
1336 if handle & 0x3 != 0x3
1337 or _winapi.GetFileType(handle) !=
1338 _winapi.FILE_TYPE_CHAR})
1339
1340
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001341 def _execute_child(self, args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +03001342 pass_fds, cwd, env,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001343 startupinfo, creationflags, shell,
1344 p2cread, p2cwrite,
1345 c2pread, c2pwrite,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001346 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001347 unused_restore_signals,
1348 unused_gid, unused_gids, unused_uid,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001349 unused_umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001350 unused_start_new_session):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001351 """Execute program (MS Windows version)"""
1352
Gregory P. Smith8edd99d2010-12-14 13:43:30 +00001353 assert not pass_fds, "pass_fds not supported on Windows."
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +00001354
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001355 if isinstance(args, str):
1356 pass
1357 elif isinstance(args, bytes):
1358 if shell:
1359 raise TypeError('bytes args is not allowed on Windows')
1360 args = list2cmdline([args])
1361 elif isinstance(args, os.PathLike):
1362 if shell:
1363 raise TypeError('path-like args is not allowed when '
1364 'shell is true')
1365 args = list2cmdline([args])
1366 else:
Serhiy Storchakabe50a7b2018-02-28 01:03:46 +02001367 args = list2cmdline(args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001368
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001369 if executable is not None:
1370 executable = os.fsdecode(executable)
1371
Peter Astrandc1d65362004-11-07 14:30:34 +00001372 # Process startup details
Peter Astrandd38ddf42005-02-10 08:32:50 +00001373 if startupinfo is None:
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001374 startupinfo = STARTUPINFO()
Victor Stinner483422f2018-07-05 22:54:17 +02001375 else:
1376 # bpo-34044: Copy STARTUPINFO since it is modified above,
1377 # so the caller can reuse it multiple times.
1378 startupinfo = startupinfo.copy()
Segev Finerb2a60832017-12-18 11:28:19 +02001379
1380 use_std_handles = -1 not in (p2cread, c2pwrite, errwrite)
1381 if use_std_handles:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001382 startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES
Peter Astrandc1d65362004-11-07 14:30:34 +00001383 startupinfo.hStdInput = p2cread
1384 startupinfo.hStdOutput = c2pwrite
1385 startupinfo.hStdError = errwrite
1386
Segev Finerb2a60832017-12-18 11:28:19 +02001387 attribute_list = startupinfo.lpAttributeList
1388 have_handle_list = bool(attribute_list and
1389 "handle_list" in attribute_list and
1390 attribute_list["handle_list"])
1391
1392 # If we were given an handle_list or need to create one
1393 if have_handle_list or (use_std_handles and close_fds):
1394 if attribute_list is None:
1395 attribute_list = startupinfo.lpAttributeList = {}
1396 handle_list = attribute_list["handle_list"] = \
1397 list(attribute_list.get("handle_list", []))
1398
1399 if use_std_handles:
1400 handle_list += [int(p2cread), int(c2pwrite), int(errwrite)]
1401
1402 handle_list[:] = self._filter_handle_list(handle_list)
1403
1404 if handle_list:
1405 if not close_fds:
1406 warnings.warn("startupinfo.lpAttributeList['handle_list'] "
1407 "overriding close_fds", RuntimeWarning)
1408
1409 # When using the handle_list we always request to inherit
1410 # handles but the only handles that will be inherited are
1411 # the ones in the handle_list
1412 close_fds = False
1413
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001414 if shell:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001415 startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW
1416 startupinfo.wShowWindow = _winapi.SW_HIDE
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001417 comspec = os.environ.get("COMSPEC", "cmd.exe")
Tim Golden126c2962010-08-11 14:20:40 +00001418 args = '{} /c "{}"'.format (comspec, args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001419
Steve Dower60419a72019-06-24 08:42:54 -07001420 if cwd is not None:
1421 cwd = os.fsdecode(cwd)
1422
1423 sys.audit("subprocess.Popen", executable, args, cwd, env)
1424
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001425 # Start the process
1426 try:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001427 hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
Tim Peterse8374a52004-10-13 03:15:00 +00001428 # no special security
1429 None, None,
Guido van Rossume7ba4952007-06-06 23:52:48 +00001430 int(not close_fds),
Tim Peterse8374a52004-10-13 03:15:00 +00001431 creationflags,
1432 env,
Steve Dower60419a72019-06-24 08:42:54 -07001433 cwd,
Tim Peterse8374a52004-10-13 03:15:00 +00001434 startupinfo)
Tim Goldenad537f22010-08-08 11:18:16 +00001435 finally:
1436 # Child is launched. Close the parent's copy of those pipe
1437 # handles that only the child should have open. You need
1438 # to make sure that no handles to the write end of the
1439 # output pipe are maintained in this process or else the
1440 # pipe will not close when the child process exits and the
1441 # ReadFile will hang.
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001442 self._close_pipe_fds(p2cread, p2cwrite,
1443 c2pread, c2pwrite,
1444 errread, errwrite)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001445
1446 # Retain the process handle, but close the thread handle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001447 self._child_created = True
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001448 self._handle = Handle(hp)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001449 self.pid = pid
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001450 _winapi.CloseHandle(ht)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001451
Brett Cannon84df1e62010-05-14 00:33:40 +00001452 def _internal_poll(self, _deadstate=None,
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001453 _WaitForSingleObject=_winapi.WaitForSingleObject,
1454 _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0,
1455 _GetExitCodeProcess=_winapi.GetExitCodeProcess):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001456 """Check if child process has terminated. Returns returncode
Brett Cannon84df1e62010-05-14 00:33:40 +00001457 attribute.
1458
1459 This method is called by __del__, so it can only refer to objects
1460 in its local scope.
1461
1462 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001463 if self.returncode is None:
Brett Cannon84df1e62010-05-14 00:33:40 +00001464 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
1465 self.returncode = _GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001466 return self.returncode
1467
1468
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001469 def _wait(self, timeout):
1470 """Internal implementation of wait() on Windows."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001471 if timeout is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001472 timeout_millis = _winapi.INFINITE
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001473 else:
Reid Kleckner91156ff2011-03-21 10:06:10 -07001474 timeout_millis = int(timeout * 1000)
Peter Astrandd38ddf42005-02-10 08:32:50 +00001475 if self.returncode is None:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001476 # API note: Returns immediately if timeout_millis == 0.
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001477 result = _winapi.WaitForSingleObject(self._handle,
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001478 timeout_millis)
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001479 if result == _winapi.WAIT_TIMEOUT:
Reid Kleckner2b228f02011-03-16 16:57:54 -04001480 raise TimeoutExpired(self.args, timeout)
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001481 self.returncode = _winapi.GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001482 return self.returncode
1483
1484
1485 def _readerthread(self, fh, buffer):
1486 buffer.append(fh.read())
Victor Stinner667d4b52010-12-25 22:40:32 +00001487 fh.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001488
1489
Reid Kleckner2b228f02011-03-16 16:57:54 -04001490 def _communicate(self, input, endtime, orig_timeout):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001491 # Start reader threads feeding into a list hanging off of this
1492 # object, unless they've already been started.
1493 if self.stdout and not hasattr(self, "_stdout_buff"):
1494 self._stdout_buff = []
1495 self.stdout_thread = \
1496 threading.Thread(target=self._readerthread,
1497 args=(self.stdout, self._stdout_buff))
1498 self.stdout_thread.daemon = True
1499 self.stdout_thread.start()
1500 if self.stderr and not hasattr(self, "_stderr_buff"):
1501 self._stderr_buff = []
1502 self.stderr_thread = \
1503 threading.Thread(target=self._readerthread,
1504 args=(self.stderr, self._stderr_buff))
1505 self.stderr_thread.daemon = True
1506 self.stderr_thread.start()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001507
1508 if self.stdin:
Victor Stinnera5e881d2015-01-14 17:07:59 +01001509 self._stdin_write(input)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001510
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001511 # Wait for the reader threads, or time out. If we time out, the
1512 # threads remain reading and the fds left open in case the user
1513 # calls communicate again.
1514 if self.stdout is not None:
1515 self.stdout_thread.join(self._remaining_time(endtime))
Andrew Svetlov377a1522012-08-19 20:49:39 +03001516 if self.stdout_thread.is_alive():
Reid Kleckner9a67e6c2011-03-20 08:28:07 -07001517 raise TimeoutExpired(self.args, orig_timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001518 if self.stderr is not None:
1519 self.stderr_thread.join(self._remaining_time(endtime))
Andrew Svetlov377a1522012-08-19 20:49:39 +03001520 if self.stderr_thread.is_alive():
Reid Kleckner9a67e6c2011-03-20 08:28:07 -07001521 raise TimeoutExpired(self.args, orig_timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001522
1523 # Collect the output from and close both pipes, now that we know
1524 # both have been read successfully.
1525 stdout = None
1526 stderr = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001527 if self.stdout:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001528 stdout = self._stdout_buff
1529 self.stdout.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001530 if self.stderr:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001531 stderr = self._stderr_buff
1532 self.stderr.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001533
1534 # All data exchanged. Translate lists into strings.
Peter Astrandd38ddf42005-02-10 08:32:50 +00001535 if stdout is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001536 stdout = stdout[0]
Peter Astrandd38ddf42005-02-10 08:32:50 +00001537 if stderr is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001538 stderr = stderr[0]
1539
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001540 return (stdout, stderr)
1541
Christian Heimesa342c012008-04-20 21:01:16 +00001542 def send_signal(self, sig):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08001543 """Send a signal to the process."""
1544 # Don't signal a process that we know has already died.
1545 if self.returncode is not None:
1546 return
Christian Heimesa342c012008-04-20 21:01:16 +00001547 if sig == signal.SIGTERM:
1548 self.terminate()
Brian Curtineb24d742010-04-12 17:16:38 +00001549 elif sig == signal.CTRL_C_EVENT:
1550 os.kill(self.pid, signal.CTRL_C_EVENT)
1551 elif sig == signal.CTRL_BREAK_EVENT:
1552 os.kill(self.pid, signal.CTRL_BREAK_EVENT)
Christian Heimesa342c012008-04-20 21:01:16 +00001553 else:
Brian Curtin19651362010-09-07 13:24:38 +00001554 raise ValueError("Unsupported signal: {}".format(sig))
Christian Heimesa342c012008-04-20 21:01:16 +00001555
1556 def terminate(self):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08001557 """Terminates the process."""
1558 # Don't terminate a process that we know has already died.
1559 if self.returncode is not None:
1560 return
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001561 try:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001562 _winapi.TerminateProcess(self._handle, 1)
Antoine Pitroub69ef162012-03-11 19:33:29 +01001563 except PermissionError:
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001564 # ERROR_ACCESS_DENIED (winerror 5) is received when the
1565 # process already died.
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001566 rc = _winapi.GetExitCodeProcess(self._handle)
1567 if rc == _winapi.STILL_ACTIVE:
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001568 raise
1569 self.returncode = rc
Christian Heimesa342c012008-04-20 21:01:16 +00001570
1571 kill = terminate
1572
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001573 else:
1574 #
1575 # POSIX methods
1576 #
1577 def _get_handles(self, stdin, stdout, stderr):
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +00001578 """Construct and return tuple with IO objects:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001579 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1580 """
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001581 p2cread, p2cwrite = -1, -1
1582 c2pread, c2pwrite = -1, -1
1583 errread, errwrite = -1, -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001584
Peter Astrandd38ddf42005-02-10 08:32:50 +00001585 if stdin is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001586 pass
1587 elif stdin == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001588 p2cread, p2cwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001589 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1590 fcntl.fcntl(p2cwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001591 elif stdin == DEVNULL:
1592 p2cread = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001593 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001594 p2cread = stdin
1595 else:
1596 # Assuming file-like object
1597 p2cread = stdin.fileno()
1598
Peter Astrandd38ddf42005-02-10 08:32:50 +00001599 if stdout is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001600 pass
1601 elif stdout == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001602 c2pread, c2pwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001603 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1604 fcntl.fcntl(c2pwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001605 elif stdout == DEVNULL:
1606 c2pwrite = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001607 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001608 c2pwrite = stdout
1609 else:
1610 # Assuming file-like object
Tim Peterse718f612004-10-12 21:51:32 +00001611 c2pwrite = stdout.fileno()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001612
Peter Astrandd38ddf42005-02-10 08:32:50 +00001613 if stderr is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001614 pass
1615 elif stderr == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001616 errread, errwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001617 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1618 fcntl.fcntl(errwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001619 elif stderr == STDOUT:
Martin Panterc7635892016-05-13 01:54:44 +00001620 if c2pwrite != -1:
1621 errwrite = c2pwrite
1622 else: # child's stdout is not set, use parent's stdout
1623 errwrite = sys.__stdout__.fileno()
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001624 elif stderr == DEVNULL:
1625 errwrite = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001626 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001627 errwrite = stderr
1628 else:
1629 # Assuming file-like object
1630 errwrite = stderr.fileno()
1631
1632 return (p2cread, p2cwrite,
1633 c2pread, c2pwrite,
1634 errread, errwrite)
1635
1636
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001637 def _posix_spawn(self, args, executable, env, restore_signals,
1638 p2cread, p2cwrite,
1639 c2pread, c2pwrite,
1640 errread, errwrite):
Victor Stinner8c349562019-01-16 23:38:06 +01001641 """Execute program using os.posix_spawn()."""
Victor Stinner9daecf32019-01-16 00:02:35 +01001642 if env is None:
1643 env = os.environ
1644
1645 kwargs = {}
1646 if restore_signals:
1647 # See _Py_RestoreSignals() in Python/pylifecycle.c
1648 sigset = []
1649 for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'):
1650 signum = getattr(signal, signame, None)
1651 if signum is not None:
1652 sigset.append(signum)
1653 kwargs['setsigdef'] = sigset
1654
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001655 file_actions = []
1656 for fd in (p2cwrite, c2pread, errread):
1657 if fd != -1:
1658 file_actions.append((os.POSIX_SPAWN_CLOSE, fd))
1659 for fd, fd2 in (
1660 (p2cread, 0),
1661 (c2pwrite, 1),
1662 (errwrite, 2),
1663 ):
1664 if fd != -1:
1665 file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2))
1666 if file_actions:
1667 kwargs['file_actions'] = file_actions
1668
Victor Stinner8c349562019-01-16 23:38:06 +01001669 self.pid = os.posix_spawn(executable, args, env, **kwargs)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001670 self._child_created = True
1671
1672 self._close_pipe_fds(p2cread, p2cwrite,
1673 c2pread, c2pwrite,
1674 errread, errwrite)
Victor Stinner9daecf32019-01-16 00:02:35 +01001675
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001676 def _execute_child(self, args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +03001677 pass_fds, cwd, env,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001678 startupinfo, creationflags, shell,
1679 p2cread, p2cwrite,
1680 c2pread, c2pwrite,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001681 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001682 restore_signals,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001683 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001684 start_new_session):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001685 """Execute program (POSIX version)"""
1686
Victor Stinner7b3b20a2011-03-03 12:54:05 +00001687 if isinstance(args, (str, bytes)):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001688 args = [args]
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001689 elif isinstance(args, os.PathLike):
1690 if shell:
1691 raise TypeError('path-like args is not allowed when '
1692 'shell is true')
1693 args = [args]
Thomas Wouters89f507f2006-12-13 04:49:30 +00001694 else:
Serhiy Storchakabe50a7b2018-02-28 01:03:46 +02001695 args = list(args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001696
1697 if shell:
Xavier de Gayeb35fc622016-12-13 16:32:21 +01001698 # On Android the default shell is at '/system/bin/sh'.
1699 unix_shell = ('/system/bin/sh' if
1700 hasattr(sys, 'getandroidapilevel') else '/bin/sh')
1701 args = [unix_shell, "-c"] + args
Stefan Krah9542cc62010-07-19 14:20:53 +00001702 if executable:
1703 args[0] = executable
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001704
Peter Astrandd38ddf42005-02-10 08:32:50 +00001705 if executable is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001706 executable = args[0]
Victor Stinner9daecf32019-01-16 00:02:35 +01001707
Steve Dower60419a72019-06-24 08:42:54 -07001708 sys.audit("subprocess.Popen", executable, args, cwd, env)
1709
Victor Stinner9daecf32019-01-16 00:02:35 +01001710 if (_USE_POSIX_SPAWN
Victor Stinner8c349562019-01-16 23:38:06 +01001711 and os.path.dirname(executable)
Victor Stinner9daecf32019-01-16 00:02:35 +01001712 and preexec_fn is None
1713 and not close_fds
1714 and not pass_fds
1715 and cwd is None
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001716 and (p2cread == -1 or p2cread > 2)
1717 and (c2pwrite == -1 or c2pwrite > 2)
1718 and (errwrite == -1 or errwrite > 2)
Victor Stinnerfaca8552019-09-25 15:52:49 +02001719 and not start_new_session
1720 and gid is None
1721 and gids is None
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001722 and uid is None
1723 and umask < 0):
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001724 self._posix_spawn(args, executable, env, restore_signals,
1725 p2cread, p2cwrite,
1726 c2pread, c2pwrite,
1727 errread, errwrite)
Victor Stinner9daecf32019-01-16 00:02:35 +01001728 return
1729
Gregory P. Smith5591b022012-10-10 03:34:47 -07001730 orig_executable = executable
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001731
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001732 # For transferring possible exec failure from child to parent.
1733 # Data format: "exception name:hex errno:description"
1734 # Pickle is not used; it is complex and involves memory allocation.
Victor Stinnerdaf45552013-08-28 00:53:59 +02001735 errpipe_read, errpipe_write = os.pipe()
Gregory P. Smith53dd8162013-12-01 16:03:24 -08001736 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
1737 low_fds_to_close = []
1738 while errpipe_write < 3:
1739 low_fds_to_close.append(errpipe_write)
1740 errpipe_write = os.dup(errpipe_write)
1741 for low_fd in low_fds_to_close:
1742 os.close(low_fd)
Christian Heimesfdab48e2008-01-20 09:06:41 +00001743 try:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001744 try:
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001745 # We must avoid complex work that could involve
1746 # malloc or free in the child process to avoid
1747 # potential deadlocks, thus we do all this here.
1748 # and pass it to fork_exec()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001749
Victor Stinner372b8382011-06-21 17:24:21 +02001750 if env is not None:
Serhiy Storchakad174d242017-06-23 19:39:27 +03001751 env_list = []
1752 for k, v in env.items():
1753 k = os.fsencode(k)
1754 if b'=' in k:
1755 raise ValueError("illegal environment variable name")
1756 env_list.append(k + b'=' + os.fsencode(v))
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001757 else:
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001758 env_list = None # Use execv instead of execve.
1759 executable = os.fsencode(executable)
1760 if os.path.dirname(executable):
1761 executable_list = (executable,)
1762 else:
1763 # This matches the behavior of os._execvpe().
1764 executable_list = tuple(
1765 os.path.join(os.fsencode(dir), executable)
1766 for dir in os.get_exec_path(env))
Gregory P. Smith361e30c2013-12-01 00:12:24 -08001767 fds_to_keep = set(pass_fds)
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001768 fds_to_keep.add(errpipe_write)
1769 self.pid = _posixsubprocess.fork_exec(
1770 args, executable_list,
Serhiy Storchaka66bffd12017-04-19 21:12:46 +03001771 close_fds, tuple(sorted(map(int, fds_to_keep))),
1772 cwd, env_list,
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001773 p2cread, p2cwrite, c2pread, c2pwrite,
1774 errread, errwrite,
1775 errpipe_read, errpipe_write,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001776 restore_signals, start_new_session,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001777 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001778 preexec_fn)
Charles-François Natali558639f2011-08-18 19:11:29 +02001779 self._child_created = True
Facundo Batista10706e22009-06-19 20:34:30 +00001780 finally:
1781 # be sure the FD is closed no matter what
1782 os.close(errpipe_write)
1783
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001784 self._close_pipe_fds(p2cread, p2cwrite,
1785 c2pread, c2pwrite,
1786 errread, errwrite)
Facundo Batista10706e22009-06-19 20:34:30 +00001787
1788 # Wait for exec to fail or succeed; possibly raising an
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001789 # exception (limited in size)
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001790 errpipe_data = bytearray()
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001791 while True:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001792 part = os.read(errpipe_read, 50000)
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001793 errpipe_data += part
1794 if not part or len(errpipe_data) > 50000:
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001795 break
Facundo Batista10706e22009-06-19 20:34:30 +00001796 finally:
1797 # be sure the FD is closed no matter what
1798 os.close(errpipe_read)
1799
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001800 if errpipe_data:
Gregory P. Smithe85db2b2010-12-14 14:38:00 +00001801 try:
Victor Stinnera58e2c52016-05-20 12:08:12 +02001802 pid, sts = os.waitpid(self.pid, 0)
1803 if pid == self.pid:
1804 self._handle_exitstatus(sts)
1805 else:
1806 self.returncode = sys.maxsize
Victor Stinnera5e881d2015-01-14 17:07:59 +01001807 except ChildProcessError:
1808 pass
Victor Stinnera58e2c52016-05-20 12:08:12 +02001809
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001810 try:
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001811 exception_name, hex_errno, err_msg = (
1812 errpipe_data.split(b':', 2))
Ammar Askar3fc499b2017-09-06 02:41:30 -04001813 # The encoding here should match the encoding
1814 # written in by the subprocess implementations
1815 # like _posixsubprocess
1816 err_msg = err_msg.decode()
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001817 except ValueError:
Gregory P. Smith8d07c262012-11-10 23:53:47 -08001818 exception_name = b'SubprocessError'
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001819 hex_errno = b'0'
Ammar Askar3fc499b2017-09-06 02:41:30 -04001820 err_msg = 'Bad exception data from child: {!r}'.format(
1821 bytes(errpipe_data))
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001822 child_exception_type = getattr(
1823 builtins, exception_name.decode('ascii'),
Gregory P. Smith8d07c262012-11-10 23:53:47 -08001824 SubprocessError)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001825 if issubclass(child_exception_type, OSError) and hex_errno:
Benjamin Petersonb8bc4392010-11-20 18:24:54 +00001826 errno_num = int(hex_errno, 16)
Gregory P. Smith5591b022012-10-10 03:34:47 -07001827 child_exec_never_called = (err_msg == "noexec")
1828 if child_exec_never_called:
1829 err_msg = ""
Gregory P. Smith8621bb52017-08-24 14:58:25 -07001830 # The error must be from chdir(cwd).
1831 err_filename = cwd
1832 else:
1833 err_filename = orig_executable
Benjamin Petersonb8bc4392010-11-20 18:24:54 +00001834 if errno_num != 0:
1835 err_msg = os.strerror(errno_num)
Gregory P. Smith8621bb52017-08-24 14:58:25 -07001836 raise child_exception_type(errno_num, err_msg, err_filename)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001837 raise child_exception_type(err_msg)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001838
1839
Victor Stinner65a796e2020-04-01 18:49:29 +02001840 def _handle_exitstatus(self, sts,
1841 waitstatus_to_exitcode=os.waitstatus_to_exitcode,
1842 _WIFSTOPPED=os.WIFSTOPPED,
1843 _WSTOPSIG=os.WSTOPSIG):
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001844 """All callers to this function MUST hold self._waitpid_lock."""
Brett Cannon84df1e62010-05-14 00:33:40 +00001845 # This method is called (indirectly) by __del__, so it cannot
Serhiy Storchaka72e77612014-02-10 19:20:22 +02001846 # refer to anything outside of its local scope.
Victor Stinner65a796e2020-04-01 18:49:29 +02001847 if _WIFSTOPPED(sts):
Gregory P. Smith50e16e32017-01-22 17:28:38 -08001848 self.returncode = -_WSTOPSIG(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001849 else:
Victor Stinner65a796e2020-04-01 18:49:29 +02001850 self.returncode = waitstatus_to_exitcode(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001851
Brett Cannon84df1e62010-05-14 00:33:40 +00001852 def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid,
Andrew Svetlov1d960fe2012-12-24 20:08:53 +02001853 _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001854 """Check if child process has terminated. Returns returncode
Brett Cannon84df1e62010-05-14 00:33:40 +00001855 attribute.
1856
1857 This method is called by __del__, so it cannot reference anything
1858 outside of the local scope (nor can any methods it calls).
1859
1860 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001861 if self.returncode is None:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001862 if not self._waitpid_lock.acquire(False):
1863 # Something else is busy calling waitpid. Don't allow two
1864 # at once. We know nothing yet.
1865 return None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001866 try:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001867 if self.returncode is not None:
1868 return self.returncode # Another thread waited.
Brett Cannon84df1e62010-05-14 00:33:40 +00001869 pid, sts = _waitpid(self.pid, _WNOHANG)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001870 if pid == self.pid:
1871 self._handle_exitstatus(sts)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +02001872 except OSError as e:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001873 if _deadstate is not None:
1874 self.returncode = _deadstate
Andrew Svetlov08bab072012-12-24 20:06:35 +02001875 elif e.errno == _ECHILD:
Gregory P. Smith39051712012-09-29 11:40:38 -07001876 # This happens if SIGCLD is set to be ignored or
1877 # waiting for child processes has otherwise been
1878 # disabled for our process. This child is dead, we
1879 # can't get the status.
1880 # http://bugs.python.org/issue15756
1881 self.returncode = 0
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001882 finally:
1883 self._waitpid_lock.release()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001884 return self.returncode
1885
1886
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001887 def _try_wait(self, wait_flags):
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001888 """All callers to this function MUST hold self._waitpid_lock."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001889 try:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001890 (pid, sts) = os.waitpid(self.pid, wait_flags)
Victor Stinnera5e881d2015-01-14 17:07:59 +01001891 except ChildProcessError:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001892 # This happens if SIGCLD is set to be ignored or waiting
1893 # for child processes has otherwise been disabled for our
1894 # process. This child is dead, we can't get the status.
1895 pid = self.pid
1896 sts = 0
1897 return (pid, sts)
1898
1899
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001900 def _wait(self, timeout):
1901 """Internal implementation of wait() on POSIX."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001902 if self.returncode is not None:
1903 return self.returncode
Reid Kleckner2b228f02011-03-16 16:57:54 -04001904
Gregory P. Smith82604e02016-11-20 16:31:07 -08001905 if timeout is not None:
1906 endtime = _time() + timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001907 # Enter a busy loop if we have a timeout. This busy loop was
1908 # cribbed from Lib/threading.py in Thread.wait() at r71065.
1909 delay = 0.0005 # 500 us -> initial delay of 1 ms
1910 while True:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001911 if self._waitpid_lock.acquire(False):
1912 try:
1913 if self.returncode is not None:
1914 break # Another thread waited.
1915 (pid, sts) = self._try_wait(os.WNOHANG)
1916 assert pid == self.pid or pid == 0
1917 if pid == self.pid:
1918 self._handle_exitstatus(sts)
1919 break
1920 finally:
1921 self._waitpid_lock.release()
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001922 remaining = self._remaining_time(endtime)
1923 if remaining <= 0:
Reid Kleckner2b228f02011-03-16 16:57:54 -04001924 raise TimeoutExpired(self.args, timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001925 delay = min(delay * 2, remaining, .05)
1926 time.sleep(delay)
Gregory P. Smithf328d792012-11-10 21:06:18 -08001927 else:
1928 while self.returncode is None:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001929 with self._waitpid_lock:
1930 if self.returncode is not None:
1931 break # Another thread waited.
1932 (pid, sts) = self._try_wait(0)
1933 # Check the pid and loop as waitpid has been known to
1934 # return 0 even without WNOHANG in odd situations.
1935 # http://bugs.python.org/issue14396.
1936 if pid == self.pid:
1937 self._handle_exitstatus(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001938 return self.returncode
1939
1940
Reid Kleckner2b228f02011-03-16 16:57:54 -04001941 def _communicate(self, input, endtime, orig_timeout):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001942 if self.stdin and not self._communication_started:
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001943 # Flush stdio buffer. This might block, if the user has
1944 # been writing to .stdin in an uncontrolled fashion.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001945 try:
1946 self.stdin.flush()
1947 except BrokenPipeError:
1948 pass # communicate() must ignore BrokenPipeError.
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001949 if not input:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001950 try:
1951 self.stdin.close()
1952 except BrokenPipeError:
1953 pass # communicate() must ignore BrokenPipeError.
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001954
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001955 stdout = None
1956 stderr = None
1957
1958 # Only create this mapping if we haven't already.
1959 if not self._communication_started:
1960 self._fileobj2output = {}
1961 if self.stdout:
1962 self._fileobj2output[self.stdout] = []
1963 if self.stderr:
1964 self._fileobj2output[self.stderr] = []
1965
1966 if self.stdout:
1967 stdout = self._fileobj2output[self.stdout]
1968 if self.stderr:
1969 stderr = self._fileobj2output[self.stderr]
1970
1971 self._save_input(input)
1972
Gregory P. Smith5ca129b2013-12-07 19:14:59 -08001973 if self._input:
1974 input_view = memoryview(self._input)
1975
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001976 with _PopenSelector() as selector:
1977 if self.stdin and input:
1978 selector.register(self.stdin, selectors.EVENT_WRITE)
Alex Rebertd3ae95e2020-01-22 18:28:31 -05001979 if self.stdout and not self.stdout.closed:
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001980 selector.register(self.stdout, selectors.EVENT_READ)
Alex Rebertd3ae95e2020-01-22 18:28:31 -05001981 if self.stderr and not self.stderr.closed:
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001982 selector.register(self.stderr, selectors.EVENT_READ)
1983
1984 while selector.get_map():
1985 timeout = self._remaining_time(endtime)
1986 if timeout is not None and timeout < 0:
Gregory P. Smith580d2782019-09-11 04:23:05 -05001987 self._check_timeout(endtime, orig_timeout,
1988 stdout, stderr,
1989 skip_check_and_raise=True)
1990 raise RuntimeError( # Impossible :)
1991 '_check_timeout(..., skip_check_and_raise=True) '
1992 'failed to raise TimeoutExpired.')
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001993
1994 ready = selector.select(timeout)
Gregory P. Smith580d2782019-09-11 04:23:05 -05001995 self._check_timeout(endtime, orig_timeout, stdout, stderr)
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001996
1997 # XXX Rewrite these to use non-blocking I/O on the file
1998 # objects; they are no longer using C stdio!
1999
2000 for key, events in ready:
2001 if key.fileobj is self.stdin:
Gregory P. Smith5ca129b2013-12-07 19:14:59 -08002002 chunk = input_view[self._input_offset :
2003 self._input_offset + _PIPE_BUF]
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002004 try:
2005 self._input_offset += os.write(key.fd, chunk)
Victor Stinnera5e881d2015-01-14 17:07:59 +01002006 except BrokenPipeError:
2007 selector.unregister(key.fileobj)
2008 key.fileobj.close()
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002009 else:
2010 if self._input_offset >= len(self._input):
2011 selector.unregister(key.fileobj)
2012 key.fileobj.close()
2013 elif key.fileobj in (self.stdout, self.stderr):
Gregory P. Smith7b83b182013-12-08 10:58:28 -08002014 data = os.read(key.fd, 32768)
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002015 if not data:
2016 selector.unregister(key.fileobj)
2017 key.fileobj.close()
2018 self._fileobj2output[key.fileobj].append(data)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04002019
2020 self.wait(timeout=self._remaining_time(endtime))
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002021
2022 # All data exchanged. Translate lists into strings.
2023 if stdout is not None:
2024 stdout = b''.join(stdout)
2025 if stderr is not None:
2026 stderr = b''.join(stderr)
2027
2028 # Translate newlines, if requested.
2029 # This also turns bytes into strings.
andyclegg7fed7bd2017-10-23 03:01:19 +01002030 if self.text_mode:
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002031 if stdout is not None:
2032 stdout = self._translate_newlines(stdout,
Steve Dower050acae2016-09-06 20:16:17 -07002033 self.stdout.encoding,
2034 self.stdout.errors)
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002035 if stderr is not None:
2036 stderr = self._translate_newlines(stderr,
Steve Dower050acae2016-09-06 20:16:17 -07002037 self.stderr.encoding,
2038 self.stderr.errors)
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002039
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002040 return (stdout, stderr)
2041
2042
Andrew Svetlovaa0dbdc2012-08-14 18:40:21 +03002043 def _save_input(self, input):
2044 # This method is called from the _communicate_with_*() methods
2045 # so that if we time out while communicating, we can continue
2046 # sending input if we retry.
2047 if self.stdin and self._input is None:
2048 self._input_offset = 0
2049 self._input = input
andyclegg7fed7bd2017-10-23 03:01:19 +01002050 if input is not None and self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -07002051 self._input = self._input.encode(self.stdin.encoding,
2052 self.stdin.errors)
Andrew Svetlovaa0dbdc2012-08-14 18:40:21 +03002053
2054
Christian Heimesa342c012008-04-20 21:01:16 +00002055 def send_signal(self, sig):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08002056 """Send a signal to the process."""
Victor Stinnere85a3052020-01-15 17:38:55 +01002057 # bpo-38630: Polling reduces the risk of sending a signal to the
2058 # wrong process if the process completed, the Popen.returncode
2059 # attribute is still None, and the pid has been reassigned
2060 # (recycled) to a new different process. This race condition can
2061 # happens in two cases.
2062 #
2063 # Case 1. Thread A calls Popen.poll(), thread B calls
2064 # Popen.send_signal(). In thread A, waitpid() succeed and returns
2065 # the exit status. Thread B calls kill() because poll() in thread A
2066 # did not set returncode yet. Calling poll() in thread B prevents
2067 # the race condition thanks to Popen._waitpid_lock.
2068 #
2069 # Case 2. waitpid(pid, 0) has been called directly, without
2070 # using Popen methods: returncode is still None is this case.
2071 # Calling Popen.poll() will set returncode to a default value,
2072 # since waitpid() fails with ProcessLookupError.
2073 self.poll()
2074 if self.returncode is not None:
2075 # Skip signalling a process that we know has already died.
2076 return
2077
2078 # The race condition can still happen if the race condition
2079 # described above happens between the returncode test
2080 # and the kill() call.
2081 os.kill(self.pid, sig)
Christian Heimesa342c012008-04-20 21:01:16 +00002082
2083 def terminate(self):
2084 """Terminate the process with SIGTERM
2085 """
2086 self.send_signal(signal.SIGTERM)
2087
2088 def kill(self):
2089 """Kill the process with SIGKILL
2090 """
2091 self.send_signal(signal.SIGKILL)