blob: e4ca5f500c21a76fb09931fa8b420b7ce3678039 [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.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00008
Martin Panter4afdca02016-10-25 22:20:48 +00009r"""Subprocesses with accessible I/O streams
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000010
Fredrik Lundh15aaacc2004-10-17 14:47:05 +000011This module allows you to spawn processes, connect to their
Martin Panter4afdca02016-10-25 22:20:48 +000012input/output/error pipes, and obtain their return codes.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000013
Martin Panter4afdca02016-10-25 22:20:48 +000014For a complete description of this module see the Python documentation.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000015
Martin Panter4afdca02016-10-25 22:20:48 +000016Main API
17========
18run(...): Runs a command, waits for it to complete, then returns a
19 CompletedProcess instance.
20Popen(...): A class for flexibly executing a command in a new process
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000021
Martin Panter4afdca02016-10-25 22:20:48 +000022Constants
23---------
24DEVNULL: Special value that indicates that os.devnull should be used
25PIPE: Special value that indicates a pipe should be created
26STDOUT: Special value that indicates that stderr should go to stdout
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000027
28
Martin Panter4afdca02016-10-25 22:20:48 +000029Older API
30=========
31call(...): Runs a command, waits for it to complete, then returns
32 the return code.
33check_call(...): Same as call() but raises CalledProcessError()
34 if return code is not 0
35check_output(...): Same as check_call() but returns the contents of
36 stdout instead of a return code
37getoutput(...): Runs a command in the shell, waits for it to complete,
38 then returns the output
39getstatusoutput(...): Runs a command in the shell, waits for it to complete,
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -070040 then returns a (exitcode, output) tuple
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000041"""
42
Zachary Ware880d42a2018-09-10 16:16:08 -070043import builtins
44import errno
Guido van Rossumfa0054a2007-05-24 04:05:35 +000045import io
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000046import os
Reid Kleckner31aa7dd2011-03-14 12:02:10 -040047import time
Christian Heimesa342c012008-04-20 21:01:16 +000048import signal
Zachary Ware880d42a2018-09-10 16:16:08 -070049import sys
50import threading
Gregory P. Smithd23047b2010-12-04 09:10:44 +000051import warnings
Giampaolo Rodolabafa8482019-01-29 22:14:24 +010052import contextlib
Victor Stinnerae586492014-09-02 23:18:25 +020053from time import monotonic as _time
Guido van Rossum48b069a2020-04-07 09:50:06 -070054import types
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000055
Patrick McLean2b2ead72019-09-12 10:15:44 -070056try:
57 import pwd
58except ImportError:
59 pwd = None
60try:
61 import grp
62except ImportError:
63 grp = None
Ruben Vorderman23c0fb82020-10-20 01:30:02 +020064try:
65 import fcntl
66except ImportError:
67 fcntl = None
68
Zachary Ware880d42a2018-09-10 16:16:08 -070069
70__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput",
71 "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL",
72 "SubprocessError", "TimeoutExpired", "CompletedProcess"]
73 # NOTE: We intentionally exclude list2cmdline as it is
74 # considered an internal implementation detail. issue10838.
75
76try:
77 import msvcrt
78 import _winapi
79 _mswindows = True
80except ModuleNotFoundError:
81 _mswindows = False
82 import _posixsubprocess
83 import select
84 import selectors
85else:
86 from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
87 STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
88 STD_ERROR_HANDLE, SW_HIDE,
89 STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW,
90 ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
91 HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
92 NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
93 CREATE_NO_WINDOW, DETACHED_PROCESS,
94 CREATE_DEFAULT_ERROR_MODE, CREATE_BREAKAWAY_FROM_JOB)
95
96 __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP",
97 "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
98 "STD_ERROR_HANDLE", "SW_HIDE",
99 "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW",
100 "STARTUPINFO",
101 "ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
102 "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
103 "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS",
104 "CREATE_NO_WINDOW", "DETACHED_PROCESS",
105 "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"])
106
107
Peter Astrand454f7672005-01-01 09:36:35 +0000108# Exception classes used by this module.
Gregory P. Smith54d412e2011-03-14 14:08:43 -0400109class SubprocessError(Exception): pass
110
111
112class CalledProcessError(SubprocessError):
Martin Panter4afdca02016-10-25 22:20:48 +0000113 """Raised when run() is called with check=True and the process
114 returns a non-zero exit status.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)d6da7602016-06-03 06:14:06 +0000115
Martin Panter4afdca02016-10-25 22:20:48 +0000116 Attributes:
117 cmd, returncode, stdout, stderr, output
Georg Brandlf9734072008-12-07 15:30:06 +0000118 """
Gregory P. Smith6e730002015-04-14 16:14:25 -0700119 def __init__(self, returncode, cmd, output=None, stderr=None):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000120 self.returncode = returncode
121 self.cmd = cmd
Georg Brandlf9734072008-12-07 15:30:06 +0000122 self.output = output
Gregory P. Smith6e730002015-04-14 16:14:25 -0700123 self.stderr = stderr
124
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000125 def __str__(self):
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)d6da7602016-06-03 06:14:06 +0000126 if self.returncode and self.returncode < 0:
127 try:
128 return "Command '%s' died with %r." % (
129 self.cmd, signal.Signals(-self.returncode))
130 except ValueError:
131 return "Command '%s' died with unknown signal %d." % (
132 self.cmd, -self.returncode)
133 else:
134 return "Command '%s' returned non-zero exit status %d." % (
135 self.cmd, self.returncode)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000136
Gregory P. Smith6e730002015-04-14 16:14:25 -0700137 @property
138 def stdout(self):
139 """Alias for output attribute, to match stderr"""
140 return self.output
141
142 @stdout.setter
143 def stdout(self, value):
144 # There's no obvious reason to set this, but allow it anyway so
145 # .stdout is a transparent alias for .output
146 self.output = value
147
Peter Astrand454f7672005-01-01 09:36:35 +0000148
Gregory P. Smith54d412e2011-03-14 14:08:43 -0400149class TimeoutExpired(SubprocessError):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400150 """This exception is raised when the timeout expires while waiting for a
151 child process.
Martin Panter4afdca02016-10-25 22:20:48 +0000152
153 Attributes:
154 cmd, output, stdout, stderr, timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400155 """
Gregory P. Smith6e730002015-04-14 16:14:25 -0700156 def __init__(self, cmd, timeout, output=None, stderr=None):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400157 self.cmd = cmd
Reid Kleckner2b228f02011-03-16 16:57:54 -0400158 self.timeout = timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400159 self.output = output
Gregory P. Smith6e730002015-04-14 16:14:25 -0700160 self.stderr = stderr
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400161
162 def __str__(self):
163 return ("Command '%s' timed out after %s seconds" %
164 (self.cmd, self.timeout))
165
Gregory P. Smith6e730002015-04-14 16:14:25 -0700166 @property
167 def stdout(self):
168 return self.output
169
170 @stdout.setter
171 def stdout(self, value):
172 # There's no obvious reason to set this, but allow it anyway so
173 # .stdout is a transparent alias for .output
174 self.output = value
175
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400176
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700177if _mswindows:
Brian Curtin1ce6b582010-04-24 16:19:22 +0000178 class STARTUPINFO:
Subhendu Ghoshae160bb2017-02-25 20:29:05 +0530179 def __init__(self, *, dwFlags=0, hStdInput=None, hStdOutput=None,
Segev Finerb2a60832017-12-18 11:28:19 +0200180 hStdError=None, wShowWindow=0, lpAttributeList=None):
Subhendu Ghoshae160bb2017-02-25 20:29:05 +0530181 self.dwFlags = dwFlags
182 self.hStdInput = hStdInput
183 self.hStdOutput = hStdOutput
184 self.hStdError = hStdError
185 self.wShowWindow = wShowWindow
Segev Finerb2a60832017-12-18 11:28:19 +0200186 self.lpAttributeList = lpAttributeList or {"handle_list": []}
Victor Stinner483422f2018-07-05 22:54:17 +0200187
188 def copy(self):
189 attr_list = self.lpAttributeList.copy()
190 if 'handle_list' in attr_list:
191 attr_list['handle_list'] = list(attr_list['handle_list'])
192
193 return STARTUPINFO(dwFlags=self.dwFlags,
194 hStdInput=self.hStdInput,
195 hStdOutput=self.hStdOutput,
196 hStdError=self.hStdError,
197 wShowWindow=self.wShowWindow,
198 lpAttributeList=attr_list)
199
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200200
201 class Handle(int):
202 closed = False
203
204 def Close(self, CloseHandle=_winapi.CloseHandle):
205 if not self.closed:
206 self.closed = True
207 CloseHandle(self)
208
209 def Detach(self):
210 if not self.closed:
211 self.closed = True
212 return int(self)
213 raise ValueError("already closed")
214
215 def __repr__(self):
Serhiy Storchaka465e60e2014-07-25 23:36:00 +0300216 return "%s(%d)" % (self.__class__.__name__, int(self))
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200217
218 __del__ = Close
Zachary Ware880d42a2018-09-10 16:16:08 -0700219else:
220 # When select or poll has indicated that the file is writable,
221 # we can write up to _PIPE_BUF bytes without risk of blocking.
222 # POSIX defines PIPE_BUF as >= 512.
223 _PIPE_BUF = getattr(select, 'PIPE_BUF', 512)
224
225 # poll/select have the advantage of not requiring any extra file
226 # descriptor, contrarily to epoll/kqueue (also, they require a single
227 # syscall).
228 if hasattr(selectors, 'PollSelector'):
229 _PopenSelector = selectors.PollSelector
230 else:
231 _PopenSelector = selectors.SelectSelector
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200232
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000233
Ruslan Kuprieiev042821a2019-06-28 19:12:16 +0300234if _mswindows:
235 # On Windows we just need to close `Popen._handle` when we no longer need
236 # it, so that the kernel can free it. `Popen._handle` gets closed
237 # implicitly when the `Popen` instance is finalized (see `Handle.__del__`,
238 # which is calling `CloseHandle` as requested in [1]), so there is nothing
239 # for `_cleanup` to do.
240 #
241 # [1] https://docs.microsoft.com/en-us/windows/desktop/ProcThread/
242 # creating-processes
243 _active = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000244
Ruslan Kuprieiev042821a2019-06-28 19:12:16 +0300245 def _cleanup():
246 pass
247else:
248 # This lists holds Popen instances for which the underlying process had not
249 # exited at the time its __del__ method got called: those processes are
250 # wait()ed for synchronously from _cleanup() when a new Popen object is
251 # created, to avoid zombie processes.
252 _active = []
253
254 def _cleanup():
255 if _active is None:
256 return
257 for inst in _active[:]:
258 res = inst._internal_poll(_deadstate=sys.maxsize)
259 if res is not None:
260 try:
261 _active.remove(inst)
262 except ValueError:
263 # This can happen if two threads create a new Popen instance.
264 # It's harmless that it was already removed, so ignore.
265 pass
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000266
267PIPE = -1
268STDOUT = -2
Ross Lagerwallba102ec2011-03-16 18:40:25 +0200269DEVNULL = -3
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000270
271
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200272# XXX This function is only used by multiprocessing and the test suite,
273# but it's here so that it can be imported when Python is compiled without
274# threads.
275
Victor Stinner9def2842016-01-18 12:15:08 +0100276def _optim_args_from_interpreter_flags():
277 """Return a list of command-line arguments reproducing the current
278 optimization settings in sys.flags."""
279 args = []
280 value = sys.flags.optimize
281 if value > 0:
282 args.append('-' + 'O' * value)
283 return args
284
285
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200286def _args_from_interpreter_flags():
287 """Return a list of command-line arguments reproducing the current
Victor Stinner747f48e2017-12-12 22:59:48 +0100288 settings in sys.flags, sys.warnoptions and sys._xoptions."""
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200289 flag_opt_map = {
290 'debug': 'd',
291 # 'inspect': 'i',
292 # 'interactive': 'i',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200293 'dont_write_bytecode': 'B',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200294 'no_site': 'S',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200295 'verbose': 'v',
296 'bytes_warning': 'b',
297 'quiet': 'q',
Victor Stinner9def2842016-01-18 12:15:08 +0100298 # -O is handled in _optim_args_from_interpreter_flags()
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200299 }
Victor Stinner9def2842016-01-18 12:15:08 +0100300 args = _optim_args_from_interpreter_flags()
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200301 for flag, opt in flag_opt_map.items():
302 v = getattr(sys.flags, flag)
303 if v > 0:
304 args.append('-' + opt * v)
Victor Stinnerf39b6742017-11-20 15:24:56 -0800305
Victor Stinner9de36322018-11-23 17:54:20 +0100306 if sys.flags.isolated:
307 args.append('-I')
308 else:
309 if sys.flags.ignore_environment:
310 args.append('-E')
311 if sys.flags.no_user_site:
312 args.append('-s')
313
Victor Stinnerf39b6742017-11-20 15:24:56 -0800314 # -W options
Victor Stinner747f48e2017-12-12 22:59:48 +0100315 warnopts = sys.warnoptions[:]
316 bytes_warning = sys.flags.bytes_warning
317 xoptions = getattr(sys, '_xoptions', {})
318 dev_mode = ('dev' in xoptions)
319
320 if bytes_warning > 1:
321 warnopts.remove("error::BytesWarning")
322 elif bytes_warning:
323 warnopts.remove("default::BytesWarning")
324 if dev_mode:
325 warnopts.remove('default')
326 for opt in warnopts:
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200327 args.append('-W' + opt)
Victor Stinnerf39b6742017-11-20 15:24:56 -0800328
329 # -X options
Victor Stinner747f48e2017-12-12 22:59:48 +0100330 if dev_mode:
Victor Stinnerf39b6742017-11-20 15:24:56 -0800331 args.extend(('-X', 'dev'))
332 for opt in ('faulthandler', 'tracemalloc', 'importtime',
Pablo Galindo1ed83ad2020-06-11 17:30:46 +0100333 'showrefcount', 'utf8'):
Victor Stinnerf39b6742017-11-20 15:24:56 -0800334 if opt in xoptions:
335 value = xoptions[opt]
336 if value is True:
337 arg = opt
338 else:
339 arg = '%s=%s' % (opt, value)
340 args.extend(('-X', arg))
341
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200342 return args
343
344
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400345def call(*popenargs, timeout=None, **kwargs):
346 """Run command with arguments. Wait for command to complete or
347 timeout, then return the returncode attribute.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000348
349 The arguments are the same as for the Popen constructor. Example:
350
351 retcode = call(["ls", "-l"])
352 """
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200353 with Popen(*popenargs, **kwargs) as p:
354 try:
355 return p.wait(timeout=timeout)
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800356 except: # Including KeyboardInterrupt, wait handled that.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200357 p.kill()
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800358 # We don't call p.wait() again as p.__exit__ does that for us.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200359 raise
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000360
361
Peter Astrand454f7672005-01-01 09:36:35 +0000362def check_call(*popenargs, **kwargs):
363 """Run command with arguments. Wait for command to complete. If
364 the exit code was zero then return, otherwise raise
365 CalledProcessError. The CalledProcessError object will have the
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000366 return code in the returncode attribute.
Peter Astrand454f7672005-01-01 09:36:35 +0000367
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400368 The arguments are the same as for the call function. Example:
Peter Astrand454f7672005-01-01 09:36:35 +0000369
370 check_call(["ls", "-l"])
371 """
372 retcode = call(*popenargs, **kwargs)
Peter Astrand454f7672005-01-01 09:36:35 +0000373 if retcode:
Georg Brandlf9734072008-12-07 15:30:06 +0000374 cmd = kwargs.get("args")
375 if cmd is None:
376 cmd = popenargs[0]
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000377 raise CalledProcessError(retcode, cmd)
Georg Brandlf9734072008-12-07 15:30:06 +0000378 return 0
379
380
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400381def check_output(*popenargs, timeout=None, **kwargs):
Gregory P. Smith91110f52013-03-19 23:25:16 -0700382 r"""Run command with arguments and return its output.
Georg Brandlf9734072008-12-07 15:30:06 +0000383
384 If the exit code was non-zero it raises a CalledProcessError. The
385 CalledProcessError object will have the return code in the returncode
386 attribute and output in the output attribute.
387
388 The arguments are the same as for the Popen constructor. Example:
389
390 >>> check_output(["ls", "-l", "/dev/null"])
Georg Brandl2708f3a2009-12-20 14:38:23 +0000391 b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
Georg Brandlf9734072008-12-07 15:30:06 +0000392
393 The stdout argument is not allowed as it is used internally.
Georg Brandl127d4702009-12-28 08:10:38 +0000394 To capture standard error in the result, use stderr=STDOUT.
Georg Brandlf9734072008-12-07 15:30:06 +0000395
396 >>> check_output(["/bin/sh", "-c",
Georg Brandl2708f3a2009-12-20 14:38:23 +0000397 ... "ls -l non_existent_file ; exit 0"],
Georg Brandl127d4702009-12-28 08:10:38 +0000398 ... stderr=STDOUT)
Georg Brandl2708f3a2009-12-20 14:38:23 +0000399 b'ls: non_existent_file: No such file or directory\n'
Gregory P. Smith91110f52013-03-19 23:25:16 -0700400
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300401 There is an additional optional argument, "input", allowing you to
402 pass a string to the subprocess's stdin. If you use this argument
403 you may not also use the Popen constructor's "stdin" argument, as
404 it too will be used internally. Example:
405
406 >>> check_output(["sed", "-e", "s/foo/bar/"],
407 ... input=b"when in the course of fooman events\n")
408 b'when in the course of barman events\n'
409
andyclegg7fed7bd2017-10-23 03:01:19 +0100410 By default, all communication is in bytes, and therefore any "input"
Matthias182e1d12019-09-10 15:51:09 +0200411 should be bytes, and the return value will be bytes. If in text mode,
andyclegg7fed7bd2017-10-23 03:01:19 +0100412 any "input" should be a string, and the return value will be a string
413 decoded according to locale encoding, or by "encoding" if set. Text mode
414 is triggered by setting any of text, encoding, errors or universal_newlines.
Georg Brandlf9734072008-12-07 15:30:06 +0000415 """
416 if 'stdout' in kwargs:
417 raise ValueError('stdout argument not allowed, it will be overridden.')
Gregory P. Smith6e730002015-04-14 16:14:25 -0700418
419 if 'input' in kwargs and kwargs['input'] is None:
420 # Explicitly passing input=None was previously equivalent to passing an
421 # empty string. That is maintained here for backwards compatibility.
Gregory P. Smith64abf372020-12-24 20:57:21 -0800422 if kwargs.get('universal_newlines') or kwargs.get('text'):
423 empty = ''
424 else:
425 empty = b''
426 kwargs['input'] = empty
Gregory P. Smith6e730002015-04-14 16:14:25 -0700427
428 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
429 **kwargs).stdout
430
431
432class CompletedProcess(object):
433 """A process that has finished running.
434
435 This is returned by run().
436
437 Attributes:
438 args: The list or str args passed to run().
439 returncode: The exit code of the process, negative for signals.
440 stdout: The standard output (None if not captured).
441 stderr: The standard error (None if not captured).
442 """
443 def __init__(self, args, returncode, stdout=None, stderr=None):
444 self.args = args
445 self.returncode = returncode
446 self.stdout = stdout
447 self.stderr = stderr
448
449 def __repr__(self):
450 args = ['args={!r}'.format(self.args),
451 'returncode={!r}'.format(self.returncode)]
452 if self.stdout is not None:
453 args.append('stdout={!r}'.format(self.stdout))
454 if self.stderr is not None:
455 args.append('stderr={!r}'.format(self.stderr))
456 return "{}({})".format(type(self).__name__, ', '.join(args))
457
Guido van Rossum48b069a2020-04-07 09:50:06 -0700458 __class_getitem__ = classmethod(types.GenericAlias)
Batuhan Taşkaya4dc5a9d2019-12-30 19:02:04 +0300459
460
Gregory P. Smith6e730002015-04-14 16:14:25 -0700461 def check_returncode(self):
462 """Raise CalledProcessError if the exit code is non-zero."""
463 if self.returncode:
464 raise CalledProcessError(self.returncode, self.args, self.stdout,
465 self.stderr)
466
467
Bo Baylesce0f33d2018-01-30 00:40:39 -0600468def run(*popenargs,
469 input=None, capture_output=False, timeout=None, check=False, **kwargs):
Gregory P. Smith6e730002015-04-14 16:14:25 -0700470 """Run command with arguments and return a CompletedProcess instance.
471
472 The returned instance will have attributes args, returncode, stdout and
473 stderr. By default, stdout and stderr are not captured, and those attributes
474 will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them.
475
476 If check is True and the exit code was non-zero, it raises a
477 CalledProcessError. The CalledProcessError object will have the return code
478 in the returncode attribute, and output & stderr attributes if those streams
479 were captured.
480
481 If timeout is given, and the process takes too long, a TimeoutExpired
482 exception will be raised.
483
484 There is an optional argument "input", allowing you to
andyclegg7fed7bd2017-10-23 03:01:19 +0100485 pass bytes or a string to the subprocess's stdin. If you use this argument
Gregory P. Smith6e730002015-04-14 16:14:25 -0700486 you may not also use the Popen constructor's "stdin" argument, as
487 it will be used internally.
488
andyclegg7fed7bd2017-10-23 03:01:19 +0100489 By default, all communication is in bytes, and therefore any "input" should
490 be bytes, and the stdout and stderr will be bytes. If in text mode, any
491 "input" should be a string, and stdout and stderr will be strings decoded
492 according to locale encoding, or by "encoding" if set. Text mode is
493 triggered by setting any of text, encoding, errors or universal_newlines.
Gregory P. Smith6e730002015-04-14 16:14:25 -0700494
andyclegg7fed7bd2017-10-23 03:01:19 +0100495 The other arguments are the same as for the Popen constructor.
Gregory P. Smith6e730002015-04-14 16:14:25 -0700496 """
497 if input is not None:
Rémi Lapeyre8cc605a2019-06-08 16:56:24 +0200498 if kwargs.get('stdin') is not None:
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300499 raise ValueError('stdin and input arguments may not both be used.')
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300500 kwargs['stdin'] = PIPE
Gregory P. Smith6e730002015-04-14 16:14:25 -0700501
Bo Baylesce0f33d2018-01-30 00:40:39 -0600502 if capture_output:
Rémi Lapeyre8cc605a2019-06-08 16:56:24 +0200503 if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None:
Bo Baylesce0f33d2018-01-30 00:40:39 -0600504 raise ValueError('stdout and stderr arguments may not be used '
505 'with capture_output.')
506 kwargs['stdout'] = PIPE
507 kwargs['stderr'] = PIPE
508
Gregory P. Smith6e730002015-04-14 16:14:25 -0700509 with Popen(*popenargs, **kwargs) as process:
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200510 try:
Gregory P. Smith6e730002015-04-14 16:14:25 -0700511 stdout, stderr = process.communicate(input, timeout=timeout)
Gregory P. Smith580d2782019-09-11 04:23:05 -0500512 except TimeoutExpired as exc:
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200513 process.kill()
Gregory P. Smith580d2782019-09-11 04:23:05 -0500514 if _mswindows:
515 # Windows accumulates the output in a single blocking
516 # read() call run on child threads, with the timeout
517 # being done in a join() on those threads. communicate()
518 # _after_ kill() is required to collect that and add it
519 # to the exception.
520 exc.stdout, exc.stderr = process.communicate()
521 else:
522 # POSIX _communicate already populated the output so
523 # far into the TimeoutExpired exception.
524 process.wait()
525 raise
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800526 except: # Including KeyboardInterrupt, communicate handled that.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200527 process.kill()
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800528 # We don't call process.wait() as .__exit__ does that for us.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200529 raise
530 retcode = process.poll()
Gregory P. Smith6e730002015-04-14 16:14:25 -0700531 if check and retcode:
532 raise CalledProcessError(retcode, process.args,
533 output=stdout, stderr=stderr)
534 return CompletedProcess(process.args, retcode, stdout, stderr)
Peter Astrand454f7672005-01-01 09:36:35 +0000535
536
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000537def list2cmdline(seq):
538 """
539 Translate a sequence of arguments into a command line
540 string, using the same rules as the MS C runtime:
541
542 1) Arguments are delimited by white space, which is either a
543 space or a tab.
544
545 2) A string surrounded by double quotation marks is
546 interpreted as a single argument, regardless of white space
Jean-Paul Calderone1ddd4072010-06-18 20:03:54 +0000547 contained within. A quoted string can be embedded in an
548 argument.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000549
550 3) A double quotation mark preceded by a backslash is
551 interpreted as a literal double quotation mark.
552
553 4) Backslashes are interpreted literally, unless they
554 immediately precede a double quotation mark.
555
556 5) If backslashes immediately precede a double quotation mark,
557 every pair of backslashes is interpreted as a literal
558 backslash. If the number of backslashes is odd, the last
559 backslash escapes the next double quotation mark as
560 described in rule 3.
561 """
562
563 # See
Eric Smith3c573af2009-11-09 15:23:15 +0000564 # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
565 # or search http://msdn.microsoft.com for
566 # "Parsing C++ Command-Line Arguments"
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000567 result = []
568 needquote = False
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +0300569 for arg in map(os.fsdecode, seq):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000570 bs_buf = []
571
572 # Add a space to separate this argument from the others
573 if result:
574 result.append(' ')
575
Jean-Paul Calderone1ddd4072010-06-18 20:03:54 +0000576 needquote = (" " in arg) or ("\t" in arg) or not arg
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000577 if needquote:
578 result.append('"')
579
580 for c in arg:
581 if c == '\\':
Tim Peterse718f612004-10-12 21:51:32 +0000582 # Don't know if we need to double yet.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000583 bs_buf.append(c)
584 elif c == '"':
Christian Heimesfdab48e2008-01-20 09:06:41 +0000585 # Double backslashes.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000586 result.append('\\' * len(bs_buf)*2)
587 bs_buf = []
588 result.append('\\"')
589 else:
590 # Normal char
591 if bs_buf:
592 result.extend(bs_buf)
593 bs_buf = []
594 result.append(c)
595
Christian Heimesfdab48e2008-01-20 09:06:41 +0000596 # Add remaining backslashes, if any.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000597 if bs_buf:
598 result.extend(bs_buf)
599
600 if needquote:
Peter Astrand7e78ade2005-03-03 21:10:23 +0000601 result.extend(bs_buf)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000602 result.append('"')
603
604 return ''.join(result)
605
606
Brett Cannona23810f2008-05-26 19:04:21 +0000607# Various tools for executing commands and looking at their output and status.
608#
Brett Cannona23810f2008-05-26 19:04:21 +0000609
610def getstatusoutput(cmd):
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700611 """Return (exitcode, output) of executing cmd in a shell.
Brett Cannona23810f2008-05-26 19:04:21 +0000612
Tim Golden60798142013-11-05 12:57:25 +0000613 Execute the string 'cmd' in a shell with 'check_output' and
Steve Dower050acae2016-09-06 20:16:17 -0700614 return a 2-tuple (status, output). The locale encoding is used
615 to decode the output and process newlines.
Tim Golden60798142013-11-05 12:57:25 +0000616
617 A trailing newline is stripped from the output.
618 The exit status for the command can be interpreted
619 according to the rules for the function 'wait'. Example:
Brett Cannona23810f2008-05-26 19:04:21 +0000620
621 >>> import subprocess
622 >>> subprocess.getstatusoutput('ls /bin/ls')
623 (0, '/bin/ls')
624 >>> subprocess.getstatusoutput('cat /bin/junk')
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700625 (1, 'cat: /bin/junk: No such file or directory')
Brett Cannona23810f2008-05-26 19:04:21 +0000626 >>> subprocess.getstatusoutput('/bin/junk')
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700627 (127, 'sh: /bin/junk: not found')
628 >>> subprocess.getstatusoutput('/bin/kill $$')
629 (-15, '')
Brett Cannona23810f2008-05-26 19:04:21 +0000630 """
Tim Goldene0041752013-11-03 12:53:17 +0000631 try:
andyclegg7fed7bd2017-10-23 03:01:19 +0100632 data = check_output(cmd, shell=True, text=True, stderr=STDOUT)
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700633 exitcode = 0
Tim Goldene0041752013-11-03 12:53:17 +0000634 except CalledProcessError as ex:
635 data = ex.output
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700636 exitcode = ex.returncode
Tim Goldene0041752013-11-03 12:53:17 +0000637 if data[-1:] == '\n':
638 data = data[:-1]
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700639 return exitcode, data
Brett Cannona23810f2008-05-26 19:04:21 +0000640
641def getoutput(cmd):
642 """Return output (stdout or stderr) of executing cmd in a shell.
643
644 Like getstatusoutput(), except the exit status is ignored and the return
645 value is a string containing the command's output. Example:
646
647 >>> import subprocess
648 >>> subprocess.getoutput('ls /bin/ls')
649 '/bin/ls'
650 """
651 return getstatusoutput(cmd)[1]
652
653
Victor Stinner9daecf32019-01-16 00:02:35 +0100654def _use_posix_spawn():
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800655 """Check if posix_spawn() can be used for subprocess.
Victor Stinner9daecf32019-01-16 00:02:35 +0100656
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800657 subprocess requires a posix_spawn() implementation that properly reports
658 errors to the parent process, & sets errno on the following failures:
Victor Stinner9daecf32019-01-16 00:02:35 +0100659
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800660 * Process attribute actions failed.
661 * File actions failed.
662 * exec() failed.
Victor Stinner9daecf32019-01-16 00:02:35 +0100663
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800664 Prefer an implementation which can use vfork() in some cases for best
665 performance.
Victor Stinner9daecf32019-01-16 00:02:35 +0100666 """
667 if _mswindows or not hasattr(os, 'posix_spawn'):
668 # os.posix_spawn() is not available
669 return False
670
671 if sys.platform == 'darwin':
672 # posix_spawn() is a syscall on macOS and properly reports errors
673 return True
674
675 # Check libc name and runtime libc version
676 try:
677 ver = os.confstr('CS_GNU_LIBC_VERSION')
678 # parse 'glibc 2.28' as ('glibc', (2, 28))
679 parts = ver.split(maxsplit=1)
680 if len(parts) != 2:
681 # reject unknown format
682 raise ValueError
683 libc = parts[0]
684 version = tuple(map(int, parts[1].split('.')))
685
686 if sys.platform == 'linux' and libc == 'glibc' and version >= (2, 24):
687 # glibc 2.24 has a new Linux posix_spawn implementation using vfork
688 # which properly reports errors to the parent process.
689 return True
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800690 # Note: Don't use the implementation in earlier glibc because it doesn't
Victor Stinner9daecf32019-01-16 00:02:35 +0100691 # use vfork (even if glibc 2.26 added a pipe to properly report errors
692 # to the parent process).
693 except (AttributeError, ValueError, OSError):
694 # os.confstr() or CS_GNU_LIBC_VERSION value not available
695 pass
696
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800697 # By default, assume that posix_spawn() does not properly report errors.
Victor Stinner9daecf32019-01-16 00:02:35 +0100698 return False
699
700
701_USE_POSIX_SPAWN = _use_posix_spawn()
702
703
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000704class Popen(object):
Martin Panter4afdca02016-10-25 22:20:48 +0000705 """ Execute a child program in a new process.
Serhiy Storchaka72e77612014-02-10 19:20:22 +0200706
Martin Panter4afdca02016-10-25 22:20:48 +0000707 For a complete description of the arguments see the Python documentation.
708
709 Arguments:
710 args: A string, or a sequence of program arguments.
711
712 bufsize: supplied as the buffering argument to the open() function when
713 creating the stdin/stdout/stderr pipe file objects
714
715 executable: A replacement program to execute.
716
717 stdin, stdout and stderr: These specify the executed programs' standard
718 input, standard output and standard error file handles, respectively.
719
720 preexec_fn: (POSIX only) An object to be called in the child process
721 just before the child is executed.
722
723 close_fds: Controls closing or inheriting of file descriptors.
724
725 shell: If true, the command will be executed through the shell.
726
727 cwd: Sets the current directory before the child is executed.
728
729 env: Defines the environment variables for the new process.
730
andyclegg7fed7bd2017-10-23 03:01:19 +0100731 text: If true, decode stdin, stdout and stderr using the given encoding
732 (if set) or the system default otherwise.
733
734 universal_newlines: Alias of text, provided for backwards compatibility.
Martin Panter4afdca02016-10-25 22:20:48 +0000735
736 startupinfo and creationflags (Windows only)
737
738 restore_signals (POSIX only)
739
740 start_new_session (POSIX only)
741
Patrick McLean2b2ead72019-09-12 10:15:44 -0700742 group (POSIX only)
743
744 extra_groups (POSIX only)
745
746 user (POSIX only)
747
Gregory P. Smithf3751ef2019-10-12 13:24:56 -0700748 umask (POSIX only)
749
Martin Panter4afdca02016-10-25 22:20:48 +0000750 pass_fds (POSIX only)
751
Martin Panter3dca6242016-10-25 23:41:42 +0000752 encoding and errors: Text mode encoding and error handling to use for
753 file objects stdin, stdout and stderr.
754
Martin Panter4afdca02016-10-25 22:20:48 +0000755 Attributes:
756 stdin, stdout, stderr, pid, returncode
757 """
Serhiy Storchaka72e77612014-02-10 19:20:22 +0200758 _child_created = False # Set here since __del__ checks it
759
Gregory P. Smitha1ed5392013-03-23 11:44:25 -0700760 def __init__(self, args, bufsize=-1, executable=None,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000761 stdin=None, stdout=None, stderr=None,
Segev Finerb2a60832017-12-18 11:28:19 +0200762 preexec_fn=None, close_fds=True,
andyclegg7fed7bd2017-10-23 03:01:19 +0100763 shell=False, cwd=None, env=None, universal_newlines=None,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000764 startupinfo=None, creationflags=0,
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000765 restore_signals=True, start_new_session=False,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700766 pass_fds=(), *, user=None, group=None, extra_groups=None,
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200767 encoding=None, errors=None, text=None, umask=-1, pipesize=-1):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000768 """Create new Popen instance."""
769 _cleanup()
Gregory P. Smithd65ba512014-04-23 00:27:17 -0700770 # Held while anything is calling waitpid before returncode has been
771 # updated to prevent clobbering returncode if wait() or poll() are
772 # called from multiple threads at once. After acquiring the lock,
773 # code must re-check self.returncode to see if another thread just
774 # finished a waitpid() call.
775 self._waitpid_lock = threading.Lock()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000776
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400777 self._input = None
778 self._communication_started = False
Guido van Rossum46a05a72007-06-07 21:56:45 +0000779 if bufsize is None:
Gregory P. Smitha1ed5392013-03-23 11:44:25 -0700780 bufsize = -1 # Restore default
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000781 if not isinstance(bufsize, int):
Peter Astrand738131d2004-11-30 21:04:45 +0000782 raise TypeError("bufsize must be an integer")
783
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200784 if pipesize is None:
785 pipesize = -1 # Restore default
786 if not isinstance(pipesize, int):
787 raise TypeError("pipesize must be an integer")
788
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700789 if _mswindows:
Tim Peterse8374a52004-10-13 03:15:00 +0000790 if preexec_fn is not None:
791 raise ValueError("preexec_fn is not supported on Windows "
792 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000793 else:
794 # POSIX
Gregory P. Smith8edd99d2010-12-14 13:43:30 +0000795 if pass_fds and not close_fds:
796 warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
797 close_fds = True
Tim Peterse8374a52004-10-13 03:15:00 +0000798 if startupinfo is not None:
799 raise ValueError("startupinfo is only supported on Windows "
800 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000801 if creationflags != 0:
Tim Peterse8374a52004-10-13 03:15:00 +0000802 raise ValueError("creationflags is only supported on Windows "
803 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000804
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400805 self.args = args
Tim Peterse718f612004-10-12 21:51:32 +0000806 self.stdin = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000807 self.stdout = None
808 self.stderr = None
809 self.pid = None
810 self.returncode = None
Steve Dower050acae2016-09-06 20:16:17 -0700811 self.encoding = encoding
812 self.errors = errors
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200813 self.pipesize = pipesize
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000814
andyclegg7fed7bd2017-10-23 03:01:19 +0100815 # Validate the combinations of text and universal_newlines
816 if (text is not None and universal_newlines is not None
817 and bool(universal_newlines) != bool(text)):
818 raise SubprocessError('Cannot disambiguate when both text '
819 'and universal_newlines are supplied but '
820 'different. Pass one or the other.')
821
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000822 # Input and output objects. The general principle is like
823 # this:
824 #
825 # Parent Child
826 # ------ -----
827 # p2cwrite ---stdin---> p2cread
828 # c2pread <--stdout--- c2pwrite
829 # errread <--stderr--- errwrite
830 #
831 # On POSIX, the child objects are file descriptors. On
832 # Windows, these are Windows file handles. The parent objects
833 # are file descriptors on both platforms. The parent objects
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000834 # are -1 when not using PIPEs. The child objects are -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000835 # when not redirecting.
Tim Peterse718f612004-10-12 21:51:32 +0000836
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000837 (p2cread, p2cwrite,
838 c2pread, c2pwrite,
839 errread, errwrite) = self._get_handles(stdin, stdout, stderr)
840
Antoine Pitrouc9982322011-01-04 19:07:07 +0000841 # We wrap OS handles *before* launching the child, otherwise a
842 # quickly terminating child could make our fds unwrappable
843 # (see #8458).
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000844
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700845 if _mswindows:
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000846 if p2cwrite != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000847 p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000848 if c2pread != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000849 c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000850 if errread != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000851 errread = msvcrt.open_osfhandle(errread.Detach(), 0)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000852
andyclegg7fed7bd2017-10-23 03:01:19 +0100853 self.text_mode = encoding or errors or text or universal_newlines
Tim Peterse718f612004-10-12 21:51:32 +0000854
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800855 # How long to resume waiting on a child after the first ^C.
856 # There is no right value for this. The purpose is to be polite
857 # yet remain good for interactive users trying to exit a tool.
858 self._sigint_wait_secs = 0.25 # 1/xkcd221.getRandomNumber()
859
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700860 self._closed_child_pipe_fds = False
Steve Dower050acae2016-09-06 20:16:17 -0700861
Alexey Izbysheva2670562018-10-20 03:22:31 +0300862 if self.text_mode:
863 if bufsize == 1:
864 line_buffering = True
865 # Use the default buffer size for the underlying binary streams
866 # since they don't support line buffering.
867 bufsize = -1
868 else:
869 line_buffering = False
870
Patrick McLean2b2ead72019-09-12 10:15:44 -0700871 gid = None
872 if group is not None:
873 if not hasattr(os, 'setregid'):
874 raise ValueError("The 'group' parameter is not supported on the "
875 "current platform")
876
877 elif isinstance(group, str):
878 if grp is None:
879 raise ValueError("The group parameter cannot be a string "
880 "on systems without the grp module")
881
882 gid = grp.getgrnam(group).gr_gid
883 elif isinstance(group, int):
884 gid = group
885 else:
886 raise TypeError("Group must be a string or an integer, not {}"
887 .format(type(group)))
888
889 if gid < 0:
890 raise ValueError(f"Group ID cannot be negative, got {gid}")
891
892 gids = None
893 if extra_groups is not None:
894 if not hasattr(os, 'setgroups'):
895 raise ValueError("The 'extra_groups' parameter is not "
896 "supported on the current platform")
897
898 elif isinstance(extra_groups, str):
899 raise ValueError("Groups must be a list, not a string")
900
901 gids = []
902 for extra_group in extra_groups:
903 if isinstance(extra_group, str):
904 if grp is None:
905 raise ValueError("Items in extra_groups cannot be "
906 "strings on systems without the "
907 "grp module")
908
909 gids.append(grp.getgrnam(extra_group).gr_gid)
910 elif isinstance(extra_group, int):
911 gids.append(extra_group)
912 else:
913 raise TypeError("Items in extra_groups must be a string "
914 "or integer, not {}"
915 .format(type(extra_group)))
916
917 # make sure that the gids are all positive here so we can do less
918 # checking in the C code
919 for gid_check in gids:
920 if gid_check < 0:
921 raise ValueError(f"Group ID cannot be negative, got {gid_check}")
922
923 uid = None
924 if user is not None:
925 if not hasattr(os, 'setreuid'):
926 raise ValueError("The 'user' parameter is not supported on "
927 "the current platform")
928
929 elif isinstance(user, str):
930 if pwd is None:
931 raise ValueError("The user parameter cannot be a string "
932 "on systems without the pwd module")
933
934 uid = pwd.getpwnam(user).pw_uid
935 elif isinstance(user, int):
936 uid = user
937 else:
938 raise TypeError("User must be a string or an integer")
939
940 if uid < 0:
941 raise ValueError(f"User ID cannot be negative, got {uid}")
942
Antoine Pitrouc9982322011-01-04 19:07:07 +0000943 try:
Steve Dower050acae2016-09-06 20:16:17 -0700944 if p2cwrite != -1:
945 self.stdin = io.open(p2cwrite, 'wb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100946 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700947 self.stdin = io.TextIOWrapper(self.stdin, write_through=True,
Alexey Izbysheva2670562018-10-20 03:22:31 +0300948 line_buffering=line_buffering,
Steve Dower050acae2016-09-06 20:16:17 -0700949 encoding=encoding, errors=errors)
950 if c2pread != -1:
951 self.stdout = io.open(c2pread, 'rb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100952 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700953 self.stdout = io.TextIOWrapper(self.stdout,
954 encoding=encoding, errors=errors)
955 if errread != -1:
956 self.stderr = io.open(errread, 'rb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100957 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700958 self.stderr = io.TextIOWrapper(self.stderr,
959 encoding=encoding, errors=errors)
960
Antoine Pitrouc9982322011-01-04 19:07:07 +0000961 self._execute_child(args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +0300962 pass_fds, cwd, env,
Antoine Pitrouc9982322011-01-04 19:07:07 +0000963 startupinfo, creationflags, shell,
964 p2cread, p2cwrite,
965 c2pread, c2pwrite,
966 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700967 restore_signals,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -0700968 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700969 start_new_session)
Antoine Pitrouc9982322011-01-04 19:07:07 +0000970 except:
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800971 # Cleanup if the child failed starting.
972 for f in filter(None, (self.stdin, self.stdout, self.stderr)):
Antoine Pitrouc9982322011-01-04 19:07:07 +0000973 try:
974 f.close()
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200975 except OSError:
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800976 pass # Ignore EBADF or other errors.
977
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700978 if not self._closed_child_pipe_fds:
979 to_close = []
980 if stdin == PIPE:
981 to_close.append(p2cread)
982 if stdout == PIPE:
983 to_close.append(c2pwrite)
984 if stderr == PIPE:
985 to_close.append(errwrite)
986 if hasattr(self, '_devnull'):
987 to_close.append(self._devnull)
988 for fd in to_close:
989 try:
Segev Finer4d385172017-08-18 16:18:13 +0300990 if _mswindows and isinstance(fd, Handle):
991 fd.Close()
992 else:
993 os.close(fd)
Gregory P. Smith22ba31a2013-06-15 18:14:56 -0700994 except OSError:
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700995 pass
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800996
Antoine Pitrouc9982322011-01-04 19:07:07 +0000997 raise
998
Andrey Doroschenko645005e2019-11-17 17:08:31 +0300999 def __repr__(self):
1000 obj_repr = (
1001 f"<{self.__class__.__name__}: "
1002 f"returncode: {self.returncode} args: {list(self.args)!r}>"
1003 )
1004 if len(obj_repr) > 80:
1005 obj_repr = obj_repr[:76] + "...>"
1006 return obj_repr
1007
Guido van Rossum48b069a2020-04-07 09:50:06 -07001008 __class_getitem__ = classmethod(types.GenericAlias)
Batuhan Taşkaya4dc5a9d2019-12-30 19:02:04 +03001009
andyclegg7fed7bd2017-10-23 03:01:19 +01001010 @property
1011 def universal_newlines(self):
1012 # universal_newlines as retained as an alias of text_mode for API
luzpaza5293b42017-11-05 07:37:50 -06001013 # compatibility. bpo-31756
andyclegg7fed7bd2017-10-23 03:01:19 +01001014 return self.text_mode
1015
1016 @universal_newlines.setter
1017 def universal_newlines(self, universal_newlines):
1018 self.text_mode = bool(universal_newlines)
1019
Steve Dower050acae2016-09-06 20:16:17 -07001020 def _translate_newlines(self, data, encoding, errors):
1021 data = data.decode(encoding, errors)
Andrew Svetlov82860712012-08-19 22:13:41 +03001022 return data.replace("\r\n", "\n").replace("\r", "\n")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001023
Brian Curtin79cdb662010-12-03 02:46:02 +00001024 def __enter__(self):
1025 return self
1026
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001027 def __exit__(self, exc_type, value, traceback):
Brian Curtin79cdb662010-12-03 02:46:02 +00001028 if self.stdout:
1029 self.stdout.close()
1030 if self.stderr:
1031 self.stderr.close()
Serhiy Storchakaab900c22015-02-28 12:43:08 +02001032 try: # Flushing a BufferedWriter may raise an error
1033 if self.stdin:
1034 self.stdin.close()
1035 finally:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001036 if exc_type == KeyboardInterrupt:
1037 # https://bugs.python.org/issue25942
1038 # In the case of a KeyboardInterrupt we assume the SIGINT
1039 # was also already sent to our child processes. We can't
1040 # block indefinitely as that is not user friendly.
1041 # If we have not already waited a brief amount of time in
1042 # an interrupted .wait() or .communicate() call, do so here
1043 # for consistency.
1044 if self._sigint_wait_secs > 0:
1045 try:
1046 self._wait(timeout=self._sigint_wait_secs)
1047 except TimeoutExpired:
1048 pass
1049 self._sigint_wait_secs = 0 # Note that this has been done.
1050 return # resume the KeyboardInterrupt
1051
Serhiy Storchakaab900c22015-02-28 12:43:08 +02001052 # Wait for the process to terminate, to avoid zombies.
1053 self.wait()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001054
Victor Stinner9505b032017-01-06 10:44:44 +01001055 def __del__(self, _maxsize=sys.maxsize, _warn=warnings.warn):
Serhiy Storchaka72e77612014-02-10 19:20:22 +02001056 if not self._child_created:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001057 # We didn't get to successfully create a child process.
1058 return
Victor Stinner5a48e212016-05-20 12:11:15 +02001059 if self.returncode is None:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001060 # Not reading subprocess exit status creates a zombie process which
Victor Stinnerc206f1e2016-06-14 16:42:59 +02001061 # is only destroyed at the parent python process exit
Victor Stinner9505b032017-01-06 10:44:44 +01001062 _warn("subprocess %s is still running" % self.pid,
1063 ResourceWarning, source=self)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001064 # In case the child hasn't been waited on, check if it's done.
Brett Cannon84df1e62010-05-14 00:33:40 +00001065 self._internal_poll(_deadstate=_maxsize)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001066 if self.returncode is None and _active is not None:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001067 # Child is still running, keep us alive until we can wait on it.
1068 _active.append(self)
1069
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001070 def _get_devnull(self):
1071 if not hasattr(self, '_devnull'):
1072 self._devnull = os.open(os.devnull, os.O_RDWR)
1073 return self._devnull
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074
Victor Stinnera5e881d2015-01-14 17:07:59 +01001075 def _stdin_write(self, input):
1076 if input:
1077 try:
1078 self.stdin.write(input)
1079 except BrokenPipeError:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001080 pass # communicate() must ignore broken pipe errors.
Victor Stinnerd52aa312017-06-08 17:30:39 +02001081 except OSError as exc:
1082 if exc.errno == errno.EINVAL:
1083 # bpo-19612, bpo-30418: On Windows, stdin.write() fails
1084 # with EINVAL if the child process exited or if the child
1085 # process is still running but closed the pipe.
Victor Stinnera5e881d2015-01-14 17:07:59 +01001086 pass
1087 else:
1088 raise
Victor Stinnerd52aa312017-06-08 17:30:39 +02001089
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001090 try:
1091 self.stdin.close()
1092 except BrokenPipeError:
1093 pass # communicate() must ignore broken pipe errors.
Victor Stinnerd52aa312017-06-08 17:30:39 +02001094 except OSError as exc:
1095 if exc.errno == errno.EINVAL:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001096 pass
1097 else:
1098 raise
Victor Stinnera5e881d2015-01-14 17:07:59 +01001099
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001100 def communicate(self, input=None, timeout=None):
Joel Schaerer88031a92017-09-13 21:11:20 +02001101 """Interact with process: Send data to stdin and close it.
1102 Read data from stdout and stderr, until end-of-file is
1103 reached. Wait for process to terminate.
Tim Peterseba28be2005-03-28 01:08:02 +00001104
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001105 The optional "input" argument should be data to be sent to the
andyclegg7fed7bd2017-10-23 03:01:19 +01001106 child process, or None, if no data should be sent to the child.
1107 communicate() returns a tuple (stdout, stderr).
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001108
andyclegg7fed7bd2017-10-23 03:01:19 +01001109 By default, all communication is in bytes, and therefore any
1110 "input" should be bytes, and the (stdout, stderr) will be bytes.
1111 If in text mode (indicated by self.text_mode), any "input" should
1112 be a string, and (stdout, stderr) will be strings decoded
1113 according to locale encoding, or by "encoding" if set. Text mode
1114 is triggered by setting any of text, encoding, errors or
1115 universal_newlines.
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001116 """
Peter Astrand23109f02005-03-03 20:28:59 +00001117
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001118 if self._communication_started and input:
1119 raise ValueError("Cannot send input after starting communication")
1120
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001121 # Optimization: If we are not worried about timeouts, we haven't
1122 # started communicating, and we have one or zero pipes, using select()
1123 # or threads is unnecessary.
Victor Stinner7a8d0812011-04-05 13:13:08 +02001124 if (timeout is None and not self._communication_started and
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001125 [self.stdin, self.stdout, self.stderr].count(None) >= 2):
Tim Peterseba28be2005-03-28 01:08:02 +00001126 stdout = None
1127 stderr = None
Peter Astrand23109f02005-03-03 20:28:59 +00001128 if self.stdin:
Victor Stinnera5e881d2015-01-14 17:07:59 +01001129 self._stdin_write(input)
Peter Astrand23109f02005-03-03 20:28:59 +00001130 elif self.stdout:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001131 stdout = self.stdout.read()
Georg Brandlf08a9dd2008-06-10 16:57:31 +00001132 self.stdout.close()
Peter Astrand23109f02005-03-03 20:28:59 +00001133 elif self.stderr:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001134 stderr = self.stderr.read()
Georg Brandlf08a9dd2008-06-10 16:57:31 +00001135 self.stderr.close()
Peter Astrand23109f02005-03-03 20:28:59 +00001136 self.wait()
Victor Stinner7a8d0812011-04-05 13:13:08 +02001137 else:
1138 if timeout is not None:
Victor Stinner949d8c92012-05-30 13:30:32 +02001139 endtime = _time() + timeout
Victor Stinner7a8d0812011-04-05 13:13:08 +02001140 else:
1141 endtime = None
Tim Peterseba28be2005-03-28 01:08:02 +00001142
Victor Stinner7a8d0812011-04-05 13:13:08 +02001143 try:
1144 stdout, stderr = self._communicate(input, endtime, timeout)
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001145 except KeyboardInterrupt:
1146 # https://bugs.python.org/issue25942
1147 # See the detailed comment in .wait().
1148 if timeout is not None:
1149 sigint_timeout = min(self._sigint_wait_secs,
1150 self._remaining_time(endtime))
1151 else:
1152 sigint_timeout = self._sigint_wait_secs
1153 self._sigint_wait_secs = 0 # nothing else should wait.
1154 try:
1155 self._wait(timeout=sigint_timeout)
1156 except TimeoutExpired:
1157 pass
1158 raise # resume the KeyboardInterrupt
1159
Victor Stinner7a8d0812011-04-05 13:13:08 +02001160 finally:
1161 self._communication_started = True
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001162
Victor Stinner7a8d0812011-04-05 13:13:08 +02001163 sts = self.wait(timeout=self._remaining_time(endtime))
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001164
1165 return (stdout, stderr)
Peter Astrand23109f02005-03-03 20:28:59 +00001166
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001167
Georg Brandl6aa2d1f2008-08-12 08:35:52 +00001168 def poll(self):
Martin Panter4afdca02016-10-25 22:20:48 +00001169 """Check if child process has terminated. Set and return returncode
1170 attribute."""
Georg Brandl6aa2d1f2008-08-12 08:35:52 +00001171 return self._internal_poll()
1172
1173
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001174 def _remaining_time(self, endtime):
1175 """Convenience for _communicate when computing timeouts."""
1176 if endtime is None:
1177 return None
1178 else:
Victor Stinner949d8c92012-05-30 13:30:32 +02001179 return endtime - _time()
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001180
1181
Gregory P. Smith580d2782019-09-11 04:23:05 -05001182 def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq,
1183 skip_check_and_raise=False):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001184 """Convenience for checking if a timeout has expired."""
1185 if endtime is None:
1186 return
Gregory P. Smith580d2782019-09-11 04:23:05 -05001187 if skip_check_and_raise or _time() > endtime:
1188 raise TimeoutExpired(
1189 self.args, orig_timeout,
1190 output=b''.join(stdout_seq) if stdout_seq else None,
1191 stderr=b''.join(stderr_seq) if stderr_seq else None)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001192
1193
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001194 def wait(self, timeout=None):
1195 """Wait for child process to terminate; returns self.returncode."""
1196 if timeout is not None:
1197 endtime = _time() + timeout
1198 try:
1199 return self._wait(timeout=timeout)
1200 except KeyboardInterrupt:
1201 # https://bugs.python.org/issue25942
1202 # The first keyboard interrupt waits briefly for the child to
1203 # exit under the common assumption that it also received the ^C
1204 # generated SIGINT and will exit rapidly.
1205 if timeout is not None:
1206 sigint_timeout = min(self._sigint_wait_secs,
1207 self._remaining_time(endtime))
1208 else:
1209 sigint_timeout = self._sigint_wait_secs
1210 self._sigint_wait_secs = 0 # nothing else should wait.
1211 try:
1212 self._wait(timeout=sigint_timeout)
1213 except TimeoutExpired:
1214 pass
1215 raise # resume the KeyboardInterrupt
1216
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001217 def _close_pipe_fds(self,
1218 p2cread, p2cwrite,
1219 c2pread, c2pwrite,
1220 errread, errwrite):
1221 # self._devnull is not always defined.
1222 devnull_fd = getattr(self, '_devnull', None)
1223
Giampaolo Rodolabafa8482019-01-29 22:14:24 +01001224 with contextlib.ExitStack() as stack:
1225 if _mswindows:
1226 if p2cread != -1:
1227 stack.callback(p2cread.Close)
1228 if c2pwrite != -1:
1229 stack.callback(c2pwrite.Close)
1230 if errwrite != -1:
1231 stack.callback(errwrite.Close)
1232 else:
1233 if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
1234 stack.callback(os.close, p2cread)
1235 if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
1236 stack.callback(os.close, c2pwrite)
1237 if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
1238 stack.callback(os.close, errwrite)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001239
Giampaolo Rodolabafa8482019-01-29 22:14:24 +01001240 if devnull_fd is not None:
1241 stack.callback(os.close, devnull_fd)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001242
1243 # Prevent a double close of these handles/fds from __init__ on error.
1244 self._closed_child_pipe_fds = True
1245
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -07001246 if _mswindows:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001247 #
1248 # Windows methods
1249 #
1250 def _get_handles(self, stdin, stdout, stderr):
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +00001251 """Construct and return tuple with IO objects:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001252 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1253 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001254 if stdin is None and stdout is None and stderr is None:
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001255 return (-1, -1, -1, -1, -1, -1)
Tim Peterse718f612004-10-12 21:51:32 +00001256
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001257 p2cread, p2cwrite = -1, -1
1258 c2pread, c2pwrite = -1, -1
1259 errread, errwrite = -1, -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001260
Peter Astrandd38ddf42005-02-10 08:32:50 +00001261 if stdin is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001262 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001263 if p2cread is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001264 p2cread, _ = _winapi.CreatePipe(None, 0)
1265 p2cread = Handle(p2cread)
1266 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001267 elif stdin == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001268 p2cread, p2cwrite = _winapi.CreatePipe(None, 0)
1269 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001270 elif stdin == DEVNULL:
1271 p2cread = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001272 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001273 p2cread = msvcrt.get_osfhandle(stdin)
1274 else:
1275 # Assuming file-like object
1276 p2cread = msvcrt.get_osfhandle(stdin.fileno())
1277 p2cread = self._make_inheritable(p2cread)
1278
Peter Astrandd38ddf42005-02-10 08:32:50 +00001279 if stdout is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001280 c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001281 if c2pwrite is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001282 _, c2pwrite = _winapi.CreatePipe(None, 0)
1283 c2pwrite = Handle(c2pwrite)
1284 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001285 elif stdout == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001286 c2pread, c2pwrite = _winapi.CreatePipe(None, 0)
1287 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001288 elif stdout == DEVNULL:
1289 c2pwrite = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001290 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001291 c2pwrite = msvcrt.get_osfhandle(stdout)
1292 else:
1293 # Assuming file-like object
1294 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
1295 c2pwrite = self._make_inheritable(c2pwrite)
1296
Peter Astrandd38ddf42005-02-10 08:32:50 +00001297 if stderr is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001298 errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001299 if errwrite is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001300 _, errwrite = _winapi.CreatePipe(None, 0)
1301 errwrite = Handle(errwrite)
1302 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001303 elif stderr == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001304 errread, errwrite = _winapi.CreatePipe(None, 0)
1305 errread, errwrite = Handle(errread), Handle(errwrite)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001306 elif stderr == STDOUT:
1307 errwrite = c2pwrite
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001308 elif stderr == DEVNULL:
1309 errwrite = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001310 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001311 errwrite = msvcrt.get_osfhandle(stderr)
1312 else:
1313 # Assuming file-like object
1314 errwrite = msvcrt.get_osfhandle(stderr.fileno())
1315 errwrite = self._make_inheritable(errwrite)
1316
1317 return (p2cread, p2cwrite,
1318 c2pread, c2pwrite,
1319 errread, errwrite)
1320
1321
1322 def _make_inheritable(self, handle):
1323 """Return a duplicate of handle, which is inheritable"""
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001324 h = _winapi.DuplicateHandle(
1325 _winapi.GetCurrentProcess(), handle,
1326 _winapi.GetCurrentProcess(), 0, 1,
1327 _winapi.DUPLICATE_SAME_ACCESS)
1328 return Handle(h)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001329
1330
Segev Finerb2a60832017-12-18 11:28:19 +02001331 def _filter_handle_list(self, handle_list):
1332 """Filter out console handles that can't be used
1333 in lpAttributeList["handle_list"] and make sure the list
1334 isn't empty. This also removes duplicate handles."""
1335 # An handle with it's lowest two bits set might be a special console
1336 # handle that if passed in lpAttributeList["handle_list"], will
1337 # cause it to fail.
1338 return list({handle for handle in handle_list
1339 if handle & 0x3 != 0x3
1340 or _winapi.GetFileType(handle) !=
1341 _winapi.FILE_TYPE_CHAR})
1342
1343
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001344 def _execute_child(self, args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +03001345 pass_fds, cwd, env,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001346 startupinfo, creationflags, shell,
1347 p2cread, p2cwrite,
1348 c2pread, c2pwrite,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001349 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001350 unused_restore_signals,
1351 unused_gid, unused_gids, unused_uid,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001352 unused_umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001353 unused_start_new_session):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001354 """Execute program (MS Windows version)"""
1355
Gregory P. Smith8edd99d2010-12-14 13:43:30 +00001356 assert not pass_fds, "pass_fds not supported on Windows."
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +00001357
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001358 if isinstance(args, str):
1359 pass
1360 elif isinstance(args, bytes):
1361 if shell:
1362 raise TypeError('bytes args is not allowed on Windows')
1363 args = list2cmdline([args])
1364 elif isinstance(args, os.PathLike):
1365 if shell:
1366 raise TypeError('path-like args is not allowed when '
1367 'shell is true')
1368 args = list2cmdline([args])
1369 else:
Serhiy Storchakabe50a7b2018-02-28 01:03:46 +02001370 args = list2cmdline(args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001371
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001372 if executable is not None:
1373 executable = os.fsdecode(executable)
1374
Peter Astrandc1d65362004-11-07 14:30:34 +00001375 # Process startup details
Peter Astrandd38ddf42005-02-10 08:32:50 +00001376 if startupinfo is None:
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001377 startupinfo = STARTUPINFO()
Victor Stinner483422f2018-07-05 22:54:17 +02001378 else:
1379 # bpo-34044: Copy STARTUPINFO since it is modified above,
1380 # so the caller can reuse it multiple times.
1381 startupinfo = startupinfo.copy()
Segev Finerb2a60832017-12-18 11:28:19 +02001382
1383 use_std_handles = -1 not in (p2cread, c2pwrite, errwrite)
1384 if use_std_handles:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001385 startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES
Peter Astrandc1d65362004-11-07 14:30:34 +00001386 startupinfo.hStdInput = p2cread
1387 startupinfo.hStdOutput = c2pwrite
1388 startupinfo.hStdError = errwrite
1389
Segev Finerb2a60832017-12-18 11:28:19 +02001390 attribute_list = startupinfo.lpAttributeList
1391 have_handle_list = bool(attribute_list and
1392 "handle_list" in attribute_list and
1393 attribute_list["handle_list"])
1394
1395 # If we were given an handle_list or need to create one
1396 if have_handle_list or (use_std_handles and close_fds):
1397 if attribute_list is None:
1398 attribute_list = startupinfo.lpAttributeList = {}
1399 handle_list = attribute_list["handle_list"] = \
1400 list(attribute_list.get("handle_list", []))
1401
1402 if use_std_handles:
1403 handle_list += [int(p2cread), int(c2pwrite), int(errwrite)]
1404
1405 handle_list[:] = self._filter_handle_list(handle_list)
1406
1407 if handle_list:
1408 if not close_fds:
1409 warnings.warn("startupinfo.lpAttributeList['handle_list'] "
1410 "overriding close_fds", RuntimeWarning)
1411
1412 # When using the handle_list we always request to inherit
1413 # handles but the only handles that will be inherited are
1414 # the ones in the handle_list
1415 close_fds = False
1416
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001417 if shell:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001418 startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW
1419 startupinfo.wShowWindow = _winapi.SW_HIDE
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001420 comspec = os.environ.get("COMSPEC", "cmd.exe")
Tim Golden126c2962010-08-11 14:20:40 +00001421 args = '{} /c "{}"'.format (comspec, args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001422
Steve Dower60419a72019-06-24 08:42:54 -07001423 if cwd is not None:
1424 cwd = os.fsdecode(cwd)
1425
1426 sys.audit("subprocess.Popen", executable, args, cwd, env)
1427
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001428 # Start the process
1429 try:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001430 hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
Tim Peterse8374a52004-10-13 03:15:00 +00001431 # no special security
1432 None, None,
Guido van Rossume7ba4952007-06-06 23:52:48 +00001433 int(not close_fds),
Tim Peterse8374a52004-10-13 03:15:00 +00001434 creationflags,
1435 env,
Steve Dower60419a72019-06-24 08:42:54 -07001436 cwd,
Tim Peterse8374a52004-10-13 03:15:00 +00001437 startupinfo)
Tim Goldenad537f22010-08-08 11:18:16 +00001438 finally:
1439 # Child is launched. Close the parent's copy of those pipe
1440 # handles that only the child should have open. You need
1441 # to make sure that no handles to the write end of the
1442 # output pipe are maintained in this process or else the
1443 # pipe will not close when the child process exits and the
1444 # ReadFile will hang.
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001445 self._close_pipe_fds(p2cread, p2cwrite,
1446 c2pread, c2pwrite,
1447 errread, errwrite)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001448
1449 # Retain the process handle, but close the thread handle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001450 self._child_created = True
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001451 self._handle = Handle(hp)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001452 self.pid = pid
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001453 _winapi.CloseHandle(ht)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001454
Brett Cannon84df1e62010-05-14 00:33:40 +00001455 def _internal_poll(self, _deadstate=None,
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001456 _WaitForSingleObject=_winapi.WaitForSingleObject,
1457 _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0,
1458 _GetExitCodeProcess=_winapi.GetExitCodeProcess):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001459 """Check if child process has terminated. Returns returncode
Brett Cannon84df1e62010-05-14 00:33:40 +00001460 attribute.
1461
1462 This method is called by __del__, so it can only refer to objects
1463 in its local scope.
1464
1465 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001466 if self.returncode is None:
Brett Cannon84df1e62010-05-14 00:33:40 +00001467 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
1468 self.returncode = _GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001469 return self.returncode
1470
1471
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001472 def _wait(self, timeout):
1473 """Internal implementation of wait() on Windows."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001474 if timeout is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001475 timeout_millis = _winapi.INFINITE
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001476 else:
Reid Kleckner91156ff2011-03-21 10:06:10 -07001477 timeout_millis = int(timeout * 1000)
Peter Astrandd38ddf42005-02-10 08:32:50 +00001478 if self.returncode is None:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001479 # API note: Returns immediately if timeout_millis == 0.
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001480 result = _winapi.WaitForSingleObject(self._handle,
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001481 timeout_millis)
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001482 if result == _winapi.WAIT_TIMEOUT:
Reid Kleckner2b228f02011-03-16 16:57:54 -04001483 raise TimeoutExpired(self.args, timeout)
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001484 self.returncode = _winapi.GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001485 return self.returncode
1486
1487
1488 def _readerthread(self, fh, buffer):
1489 buffer.append(fh.read())
Victor Stinner667d4b52010-12-25 22:40:32 +00001490 fh.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001491
1492
Reid Kleckner2b228f02011-03-16 16:57:54 -04001493 def _communicate(self, input, endtime, orig_timeout):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001494 # Start reader threads feeding into a list hanging off of this
1495 # object, unless they've already been started.
1496 if self.stdout and not hasattr(self, "_stdout_buff"):
1497 self._stdout_buff = []
1498 self.stdout_thread = \
1499 threading.Thread(target=self._readerthread,
1500 args=(self.stdout, self._stdout_buff))
1501 self.stdout_thread.daemon = True
1502 self.stdout_thread.start()
1503 if self.stderr and not hasattr(self, "_stderr_buff"):
1504 self._stderr_buff = []
1505 self.stderr_thread = \
1506 threading.Thread(target=self._readerthread,
1507 args=(self.stderr, self._stderr_buff))
1508 self.stderr_thread.daemon = True
1509 self.stderr_thread.start()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001510
1511 if self.stdin:
Victor Stinnera5e881d2015-01-14 17:07:59 +01001512 self._stdin_write(input)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001513
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001514 # Wait for the reader threads, or time out. If we time out, the
1515 # threads remain reading and the fds left open in case the user
1516 # calls communicate again.
1517 if self.stdout is not None:
1518 self.stdout_thread.join(self._remaining_time(endtime))
Andrew Svetlov377a1522012-08-19 20:49:39 +03001519 if self.stdout_thread.is_alive():
Reid Kleckner9a67e6c2011-03-20 08:28:07 -07001520 raise TimeoutExpired(self.args, orig_timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001521 if self.stderr is not None:
1522 self.stderr_thread.join(self._remaining_time(endtime))
Andrew Svetlov377a1522012-08-19 20:49:39 +03001523 if self.stderr_thread.is_alive():
Reid Kleckner9a67e6c2011-03-20 08:28:07 -07001524 raise TimeoutExpired(self.args, orig_timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001525
1526 # Collect the output from and close both pipes, now that we know
1527 # both have been read successfully.
1528 stdout = None
1529 stderr = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001530 if self.stdout:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001531 stdout = self._stdout_buff
1532 self.stdout.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001533 if self.stderr:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001534 stderr = self._stderr_buff
1535 self.stderr.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001536
1537 # All data exchanged. Translate lists into strings.
Peter Astrandd38ddf42005-02-10 08:32:50 +00001538 if stdout is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001539 stdout = stdout[0]
Peter Astrandd38ddf42005-02-10 08:32:50 +00001540 if stderr is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001541 stderr = stderr[0]
1542
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001543 return (stdout, stderr)
1544
Christian Heimesa342c012008-04-20 21:01:16 +00001545 def send_signal(self, sig):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08001546 """Send a signal to the process."""
1547 # Don't signal a process that we know has already died.
1548 if self.returncode is not None:
1549 return
Christian Heimesa342c012008-04-20 21:01:16 +00001550 if sig == signal.SIGTERM:
1551 self.terminate()
Brian Curtineb24d742010-04-12 17:16:38 +00001552 elif sig == signal.CTRL_C_EVENT:
1553 os.kill(self.pid, signal.CTRL_C_EVENT)
1554 elif sig == signal.CTRL_BREAK_EVENT:
1555 os.kill(self.pid, signal.CTRL_BREAK_EVENT)
Christian Heimesa342c012008-04-20 21:01:16 +00001556 else:
Brian Curtin19651362010-09-07 13:24:38 +00001557 raise ValueError("Unsupported signal: {}".format(sig))
Christian Heimesa342c012008-04-20 21:01:16 +00001558
1559 def terminate(self):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08001560 """Terminates the process."""
1561 # Don't terminate a process that we know has already died.
1562 if self.returncode is not None:
1563 return
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001564 try:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001565 _winapi.TerminateProcess(self._handle, 1)
Antoine Pitroub69ef162012-03-11 19:33:29 +01001566 except PermissionError:
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001567 # ERROR_ACCESS_DENIED (winerror 5) is received when the
1568 # process already died.
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001569 rc = _winapi.GetExitCodeProcess(self._handle)
1570 if rc == _winapi.STILL_ACTIVE:
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001571 raise
1572 self.returncode = rc
Christian Heimesa342c012008-04-20 21:01:16 +00001573
1574 kill = terminate
1575
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001576 else:
1577 #
1578 # POSIX methods
1579 #
1580 def _get_handles(self, stdin, stdout, stderr):
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +00001581 """Construct and return tuple with IO objects:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001582 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1583 """
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001584 p2cread, p2cwrite = -1, -1
1585 c2pread, c2pwrite = -1, -1
1586 errread, errwrite = -1, -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001587
Peter Astrandd38ddf42005-02-10 08:32:50 +00001588 if stdin is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001589 pass
1590 elif stdin == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001591 p2cread, p2cwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001592 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1593 fcntl.fcntl(p2cwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001594 elif stdin == DEVNULL:
1595 p2cread = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001596 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001597 p2cread = stdin
1598 else:
1599 # Assuming file-like object
1600 p2cread = stdin.fileno()
1601
Peter Astrandd38ddf42005-02-10 08:32:50 +00001602 if stdout is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001603 pass
1604 elif stdout == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001605 c2pread, c2pwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001606 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1607 fcntl.fcntl(c2pwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001608 elif stdout == DEVNULL:
1609 c2pwrite = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001610 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001611 c2pwrite = stdout
1612 else:
1613 # Assuming file-like object
Tim Peterse718f612004-10-12 21:51:32 +00001614 c2pwrite = stdout.fileno()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001615
Peter Astrandd38ddf42005-02-10 08:32:50 +00001616 if stderr is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001617 pass
1618 elif stderr == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001619 errread, errwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001620 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1621 fcntl.fcntl(errwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001622 elif stderr == STDOUT:
Martin Panterc7635892016-05-13 01:54:44 +00001623 if c2pwrite != -1:
1624 errwrite = c2pwrite
1625 else: # child's stdout is not set, use parent's stdout
1626 errwrite = sys.__stdout__.fileno()
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001627 elif stderr == DEVNULL:
1628 errwrite = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001629 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001630 errwrite = stderr
1631 else:
1632 # Assuming file-like object
1633 errwrite = stderr.fileno()
1634
1635 return (p2cread, p2cwrite,
1636 c2pread, c2pwrite,
1637 errread, errwrite)
1638
1639
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001640 def _posix_spawn(self, args, executable, env, restore_signals,
1641 p2cread, p2cwrite,
1642 c2pread, c2pwrite,
1643 errread, errwrite):
Victor Stinner8c349562019-01-16 23:38:06 +01001644 """Execute program using os.posix_spawn()."""
Victor Stinner9daecf32019-01-16 00:02:35 +01001645 if env is None:
1646 env = os.environ
1647
1648 kwargs = {}
1649 if restore_signals:
1650 # See _Py_RestoreSignals() in Python/pylifecycle.c
1651 sigset = []
1652 for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'):
1653 signum = getattr(signal, signame, None)
1654 if signum is not None:
1655 sigset.append(signum)
1656 kwargs['setsigdef'] = sigset
1657
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001658 file_actions = []
1659 for fd in (p2cwrite, c2pread, errread):
1660 if fd != -1:
1661 file_actions.append((os.POSIX_SPAWN_CLOSE, fd))
1662 for fd, fd2 in (
1663 (p2cread, 0),
1664 (c2pwrite, 1),
1665 (errwrite, 2),
1666 ):
1667 if fd != -1:
1668 file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2))
1669 if file_actions:
1670 kwargs['file_actions'] = file_actions
1671
Victor Stinner8c349562019-01-16 23:38:06 +01001672 self.pid = os.posix_spawn(executable, args, env, **kwargs)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001673 self._child_created = True
1674
1675 self._close_pipe_fds(p2cread, p2cwrite,
1676 c2pread, c2pwrite,
1677 errread, errwrite)
Victor Stinner9daecf32019-01-16 00:02:35 +01001678
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001679 def _execute_child(self, args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +03001680 pass_fds, cwd, env,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001681 startupinfo, creationflags, shell,
1682 p2cread, p2cwrite,
1683 c2pread, c2pwrite,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001684 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001685 restore_signals,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001686 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001687 start_new_session):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001688 """Execute program (POSIX version)"""
1689
Victor Stinner7b3b20a2011-03-03 12:54:05 +00001690 if isinstance(args, (str, bytes)):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001691 args = [args]
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001692 elif isinstance(args, os.PathLike):
1693 if shell:
1694 raise TypeError('path-like args is not allowed when '
1695 'shell is true')
1696 args = [args]
Thomas Wouters89f507f2006-12-13 04:49:30 +00001697 else:
Serhiy Storchakabe50a7b2018-02-28 01:03:46 +02001698 args = list(args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001699
1700 if shell:
Xavier de Gayeb35fc622016-12-13 16:32:21 +01001701 # On Android the default shell is at '/system/bin/sh'.
1702 unix_shell = ('/system/bin/sh' if
1703 hasattr(sys, 'getandroidapilevel') else '/bin/sh')
1704 args = [unix_shell, "-c"] + args
Stefan Krah9542cc62010-07-19 14:20:53 +00001705 if executable:
1706 args[0] = executable
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001707
Peter Astrandd38ddf42005-02-10 08:32:50 +00001708 if executable is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001709 executable = args[0]
Victor Stinner9daecf32019-01-16 00:02:35 +01001710
Steve Dower60419a72019-06-24 08:42:54 -07001711 sys.audit("subprocess.Popen", executable, args, cwd, env)
1712
Victor Stinner9daecf32019-01-16 00:02:35 +01001713 if (_USE_POSIX_SPAWN
Victor Stinner8c349562019-01-16 23:38:06 +01001714 and os.path.dirname(executable)
Victor Stinner9daecf32019-01-16 00:02:35 +01001715 and preexec_fn is None
1716 and not close_fds
1717 and not pass_fds
1718 and cwd is None
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001719 and (p2cread == -1 or p2cread > 2)
1720 and (c2pwrite == -1 or c2pwrite > 2)
1721 and (errwrite == -1 or errwrite > 2)
Victor Stinnerfaca8552019-09-25 15:52:49 +02001722 and not start_new_session
1723 and gid is None
1724 and gids is None
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001725 and uid is None
1726 and umask < 0):
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001727 self._posix_spawn(args, executable, env, restore_signals,
1728 p2cread, p2cwrite,
1729 c2pread, c2pwrite,
1730 errread, errwrite)
Victor Stinner9daecf32019-01-16 00:02:35 +01001731 return
1732
Gregory P. Smith5591b022012-10-10 03:34:47 -07001733 orig_executable = executable
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001734
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001735 # For transferring possible exec failure from child to parent.
1736 # Data format: "exception name:hex errno:description"
1737 # Pickle is not used; it is complex and involves memory allocation.
Victor Stinnerdaf45552013-08-28 00:53:59 +02001738 errpipe_read, errpipe_write = os.pipe()
Gregory P. Smith53dd8162013-12-01 16:03:24 -08001739 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
1740 low_fds_to_close = []
1741 while errpipe_write < 3:
1742 low_fds_to_close.append(errpipe_write)
1743 errpipe_write = os.dup(errpipe_write)
1744 for low_fd in low_fds_to_close:
1745 os.close(low_fd)
Christian Heimesfdab48e2008-01-20 09:06:41 +00001746 try:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001747 try:
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001748 # We must avoid complex work that could involve
1749 # malloc or free in the child process to avoid
1750 # potential deadlocks, thus we do all this here.
1751 # and pass it to fork_exec()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001752
Victor Stinner372b8382011-06-21 17:24:21 +02001753 if env is not None:
Serhiy Storchakad174d242017-06-23 19:39:27 +03001754 env_list = []
1755 for k, v in env.items():
1756 k = os.fsencode(k)
1757 if b'=' in k:
1758 raise ValueError("illegal environment variable name")
1759 env_list.append(k + b'=' + os.fsencode(v))
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001760 else:
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001761 env_list = None # Use execv instead of execve.
1762 executable = os.fsencode(executable)
1763 if os.path.dirname(executable):
1764 executable_list = (executable,)
1765 else:
1766 # This matches the behavior of os._execvpe().
1767 executable_list = tuple(
1768 os.path.join(os.fsencode(dir), executable)
1769 for dir in os.get_exec_path(env))
Gregory P. Smith361e30c2013-12-01 00:12:24 -08001770 fds_to_keep = set(pass_fds)
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001771 fds_to_keep.add(errpipe_write)
1772 self.pid = _posixsubprocess.fork_exec(
1773 args, executable_list,
Serhiy Storchaka66bffd12017-04-19 21:12:46 +03001774 close_fds, tuple(sorted(map(int, fds_to_keep))),
1775 cwd, env_list,
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001776 p2cread, p2cwrite, c2pread, c2pwrite,
1777 errread, errwrite,
1778 errpipe_read, errpipe_write,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001779 restore_signals, start_new_session,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001780 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001781 preexec_fn)
Charles-François Natali558639f2011-08-18 19:11:29 +02001782 self._child_created = True
Facundo Batista10706e22009-06-19 20:34:30 +00001783 finally:
1784 # be sure the FD is closed no matter what
1785 os.close(errpipe_write)
1786
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001787 self._close_pipe_fds(p2cread, p2cwrite,
1788 c2pread, c2pwrite,
1789 errread, errwrite)
Facundo Batista10706e22009-06-19 20:34:30 +00001790
1791 # Wait for exec to fail or succeed; possibly raising an
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001792 # exception (limited in size)
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001793 errpipe_data = bytearray()
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001794 while True:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001795 part = os.read(errpipe_read, 50000)
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001796 errpipe_data += part
1797 if not part or len(errpipe_data) > 50000:
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001798 break
Facundo Batista10706e22009-06-19 20:34:30 +00001799 finally:
1800 # be sure the FD is closed no matter what
1801 os.close(errpipe_read)
1802
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001803 if errpipe_data:
Gregory P. Smithe85db2b2010-12-14 14:38:00 +00001804 try:
Victor Stinnera58e2c52016-05-20 12:08:12 +02001805 pid, sts = os.waitpid(self.pid, 0)
1806 if pid == self.pid:
1807 self._handle_exitstatus(sts)
1808 else:
1809 self.returncode = sys.maxsize
Victor Stinnera5e881d2015-01-14 17:07:59 +01001810 except ChildProcessError:
1811 pass
Victor Stinnera58e2c52016-05-20 12:08:12 +02001812
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001813 try:
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001814 exception_name, hex_errno, err_msg = (
1815 errpipe_data.split(b':', 2))
Ammar Askar3fc499b2017-09-06 02:41:30 -04001816 # The encoding here should match the encoding
1817 # written in by the subprocess implementations
1818 # like _posixsubprocess
1819 err_msg = err_msg.decode()
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001820 except ValueError:
Gregory P. Smith8d07c262012-11-10 23:53:47 -08001821 exception_name = b'SubprocessError'
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001822 hex_errno = b'0'
Ammar Askar3fc499b2017-09-06 02:41:30 -04001823 err_msg = 'Bad exception data from child: {!r}'.format(
1824 bytes(errpipe_data))
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001825 child_exception_type = getattr(
1826 builtins, exception_name.decode('ascii'),
Gregory P. Smith8d07c262012-11-10 23:53:47 -08001827 SubprocessError)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001828 if issubclass(child_exception_type, OSError) and hex_errno:
Benjamin Petersonb8bc4392010-11-20 18:24:54 +00001829 errno_num = int(hex_errno, 16)
Gregory P. Smith5591b022012-10-10 03:34:47 -07001830 child_exec_never_called = (err_msg == "noexec")
1831 if child_exec_never_called:
1832 err_msg = ""
Gregory P. Smith8621bb52017-08-24 14:58:25 -07001833 # The error must be from chdir(cwd).
1834 err_filename = cwd
1835 else:
1836 err_filename = orig_executable
Benjamin Petersonb8bc4392010-11-20 18:24:54 +00001837 if errno_num != 0:
1838 err_msg = os.strerror(errno_num)
Gregory P. Smith8621bb52017-08-24 14:58:25 -07001839 raise child_exception_type(errno_num, err_msg, err_filename)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001840 raise child_exception_type(err_msg)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001841
1842
Victor Stinner65a796e2020-04-01 18:49:29 +02001843 def _handle_exitstatus(self, sts,
1844 waitstatus_to_exitcode=os.waitstatus_to_exitcode,
1845 _WIFSTOPPED=os.WIFSTOPPED,
1846 _WSTOPSIG=os.WSTOPSIG):
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001847 """All callers to this function MUST hold self._waitpid_lock."""
Brett Cannon84df1e62010-05-14 00:33:40 +00001848 # This method is called (indirectly) by __del__, so it cannot
Serhiy Storchaka72e77612014-02-10 19:20:22 +02001849 # refer to anything outside of its local scope.
Victor Stinner65a796e2020-04-01 18:49:29 +02001850 if _WIFSTOPPED(sts):
Gregory P. Smith50e16e32017-01-22 17:28:38 -08001851 self.returncode = -_WSTOPSIG(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001852 else:
Victor Stinner65a796e2020-04-01 18:49:29 +02001853 self.returncode = waitstatus_to_exitcode(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001854
Brett Cannon84df1e62010-05-14 00:33:40 +00001855 def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid,
Andrew Svetlov1d960fe2012-12-24 20:08:53 +02001856 _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001857 """Check if child process has terminated. Returns returncode
Brett Cannon84df1e62010-05-14 00:33:40 +00001858 attribute.
1859
1860 This method is called by __del__, so it cannot reference anything
1861 outside of the local scope (nor can any methods it calls).
1862
1863 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001864 if self.returncode is None:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001865 if not self._waitpid_lock.acquire(False):
1866 # Something else is busy calling waitpid. Don't allow two
1867 # at once. We know nothing yet.
1868 return None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001869 try:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001870 if self.returncode is not None:
1871 return self.returncode # Another thread waited.
Brett Cannon84df1e62010-05-14 00:33:40 +00001872 pid, sts = _waitpid(self.pid, _WNOHANG)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001873 if pid == self.pid:
1874 self._handle_exitstatus(sts)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +02001875 except OSError as e:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001876 if _deadstate is not None:
1877 self.returncode = _deadstate
Andrew Svetlov08bab072012-12-24 20:06:35 +02001878 elif e.errno == _ECHILD:
Gregory P. Smith39051712012-09-29 11:40:38 -07001879 # This happens if SIGCLD is set to be ignored or
1880 # waiting for child processes has otherwise been
1881 # disabled for our process. This child is dead, we
1882 # can't get the status.
1883 # http://bugs.python.org/issue15756
1884 self.returncode = 0
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001885 finally:
1886 self._waitpid_lock.release()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001887 return self.returncode
1888
1889
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001890 def _try_wait(self, wait_flags):
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001891 """All callers to this function MUST hold self._waitpid_lock."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001892 try:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001893 (pid, sts) = os.waitpid(self.pid, wait_flags)
Victor Stinnera5e881d2015-01-14 17:07:59 +01001894 except ChildProcessError:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001895 # This happens if SIGCLD is set to be ignored or waiting
1896 # for child processes has otherwise been disabled for our
1897 # process. This child is dead, we can't get the status.
1898 pid = self.pid
1899 sts = 0
1900 return (pid, sts)
1901
1902
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001903 def _wait(self, timeout):
1904 """Internal implementation of wait() on POSIX."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001905 if self.returncode is not None:
1906 return self.returncode
Reid Kleckner2b228f02011-03-16 16:57:54 -04001907
Gregory P. Smith82604e02016-11-20 16:31:07 -08001908 if timeout is not None:
1909 endtime = _time() + timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001910 # Enter a busy loop if we have a timeout. This busy loop was
1911 # cribbed from Lib/threading.py in Thread.wait() at r71065.
1912 delay = 0.0005 # 500 us -> initial delay of 1 ms
1913 while True:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001914 if self._waitpid_lock.acquire(False):
1915 try:
1916 if self.returncode is not None:
1917 break # Another thread waited.
1918 (pid, sts) = self._try_wait(os.WNOHANG)
1919 assert pid == self.pid or pid == 0
1920 if pid == self.pid:
1921 self._handle_exitstatus(sts)
1922 break
1923 finally:
1924 self._waitpid_lock.release()
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001925 remaining = self._remaining_time(endtime)
1926 if remaining <= 0:
Reid Kleckner2b228f02011-03-16 16:57:54 -04001927 raise TimeoutExpired(self.args, timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001928 delay = min(delay * 2, remaining, .05)
1929 time.sleep(delay)
Gregory P. Smithf328d792012-11-10 21:06:18 -08001930 else:
1931 while self.returncode is None:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001932 with self._waitpid_lock:
1933 if self.returncode is not None:
1934 break # Another thread waited.
1935 (pid, sts) = self._try_wait(0)
1936 # Check the pid and loop as waitpid has been known to
1937 # return 0 even without WNOHANG in odd situations.
1938 # http://bugs.python.org/issue14396.
1939 if pid == self.pid:
1940 self._handle_exitstatus(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001941 return self.returncode
1942
1943
Reid Kleckner2b228f02011-03-16 16:57:54 -04001944 def _communicate(self, input, endtime, orig_timeout):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001945 if self.stdin and not self._communication_started:
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001946 # Flush stdio buffer. This might block, if the user has
1947 # been writing to .stdin in an uncontrolled fashion.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001948 try:
1949 self.stdin.flush()
1950 except BrokenPipeError:
1951 pass # communicate() must ignore BrokenPipeError.
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001952 if not input:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001953 try:
1954 self.stdin.close()
1955 except BrokenPipeError:
1956 pass # communicate() must ignore BrokenPipeError.
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001957
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001958 stdout = None
1959 stderr = None
1960
1961 # Only create this mapping if we haven't already.
1962 if not self._communication_started:
1963 self._fileobj2output = {}
1964 if self.stdout:
1965 self._fileobj2output[self.stdout] = []
1966 if self.stderr:
1967 self._fileobj2output[self.stderr] = []
1968
1969 if self.stdout:
1970 stdout = self._fileobj2output[self.stdout]
1971 if self.stderr:
1972 stderr = self._fileobj2output[self.stderr]
1973
1974 self._save_input(input)
1975
Gregory P. Smith5ca129b2013-12-07 19:14:59 -08001976 if self._input:
1977 input_view = memoryview(self._input)
1978
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001979 with _PopenSelector() as selector:
1980 if self.stdin and input:
1981 selector.register(self.stdin, selectors.EVENT_WRITE)
Alex Rebertd3ae95e2020-01-22 18:28:31 -05001982 if self.stdout and not self.stdout.closed:
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001983 selector.register(self.stdout, selectors.EVENT_READ)
Alex Rebertd3ae95e2020-01-22 18:28:31 -05001984 if self.stderr and not self.stderr.closed:
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001985 selector.register(self.stderr, selectors.EVENT_READ)
1986
1987 while selector.get_map():
1988 timeout = self._remaining_time(endtime)
1989 if timeout is not None and timeout < 0:
Gregory P. Smith580d2782019-09-11 04:23:05 -05001990 self._check_timeout(endtime, orig_timeout,
1991 stdout, stderr,
1992 skip_check_and_raise=True)
1993 raise RuntimeError( # Impossible :)
1994 '_check_timeout(..., skip_check_and_raise=True) '
1995 'failed to raise TimeoutExpired.')
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001996
1997 ready = selector.select(timeout)
Gregory P. Smith580d2782019-09-11 04:23:05 -05001998 self._check_timeout(endtime, orig_timeout, stdout, stderr)
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001999
2000 # XXX Rewrite these to use non-blocking I/O on the file
2001 # objects; they are no longer using C stdio!
2002
2003 for key, events in ready:
2004 if key.fileobj is self.stdin:
Gregory P. Smith5ca129b2013-12-07 19:14:59 -08002005 chunk = input_view[self._input_offset :
2006 self._input_offset + _PIPE_BUF]
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002007 try:
2008 self._input_offset += os.write(key.fd, chunk)
Victor Stinnera5e881d2015-01-14 17:07:59 +01002009 except BrokenPipeError:
2010 selector.unregister(key.fileobj)
2011 key.fileobj.close()
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002012 else:
2013 if self._input_offset >= len(self._input):
2014 selector.unregister(key.fileobj)
2015 key.fileobj.close()
2016 elif key.fileobj in (self.stdout, self.stderr):
Gregory P. Smith7b83b182013-12-08 10:58:28 -08002017 data = os.read(key.fd, 32768)
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002018 if not data:
2019 selector.unregister(key.fileobj)
2020 key.fileobj.close()
2021 self._fileobj2output[key.fileobj].append(data)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04002022
2023 self.wait(timeout=self._remaining_time(endtime))
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002024
2025 # All data exchanged. Translate lists into strings.
2026 if stdout is not None:
2027 stdout = b''.join(stdout)
2028 if stderr is not None:
2029 stderr = b''.join(stderr)
2030
2031 # Translate newlines, if requested.
2032 # This also turns bytes into strings.
andyclegg7fed7bd2017-10-23 03:01:19 +01002033 if self.text_mode:
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002034 if stdout is not None:
2035 stdout = self._translate_newlines(stdout,
Steve Dower050acae2016-09-06 20:16:17 -07002036 self.stdout.encoding,
2037 self.stdout.errors)
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002038 if stderr is not None:
2039 stderr = self._translate_newlines(stderr,
Steve Dower050acae2016-09-06 20:16:17 -07002040 self.stderr.encoding,
2041 self.stderr.errors)
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002042
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002043 return (stdout, stderr)
2044
2045
Andrew Svetlovaa0dbdc2012-08-14 18:40:21 +03002046 def _save_input(self, input):
2047 # This method is called from the _communicate_with_*() methods
2048 # so that if we time out while communicating, we can continue
2049 # sending input if we retry.
2050 if self.stdin and self._input is None:
2051 self._input_offset = 0
2052 self._input = input
andyclegg7fed7bd2017-10-23 03:01:19 +01002053 if input is not None and self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -07002054 self._input = self._input.encode(self.stdin.encoding,
2055 self.stdin.errors)
Andrew Svetlovaa0dbdc2012-08-14 18:40:21 +03002056
2057
Christian Heimesa342c012008-04-20 21:01:16 +00002058 def send_signal(self, sig):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08002059 """Send a signal to the process."""
Victor Stinnere85a3052020-01-15 17:38:55 +01002060 # bpo-38630: Polling reduces the risk of sending a signal to the
2061 # wrong process if the process completed, the Popen.returncode
2062 # attribute is still None, and the pid has been reassigned
2063 # (recycled) to a new different process. This race condition can
2064 # happens in two cases.
2065 #
2066 # Case 1. Thread A calls Popen.poll(), thread B calls
2067 # Popen.send_signal(). In thread A, waitpid() succeed and returns
2068 # the exit status. Thread B calls kill() because poll() in thread A
2069 # did not set returncode yet. Calling poll() in thread B prevents
2070 # the race condition thanks to Popen._waitpid_lock.
2071 #
2072 # Case 2. waitpid(pid, 0) has been called directly, without
2073 # using Popen methods: returncode is still None is this case.
2074 # Calling Popen.poll() will set returncode to a default value,
2075 # since waitpid() fails with ProcessLookupError.
2076 self.poll()
2077 if self.returncode is not None:
2078 # Skip signalling a process that we know has already died.
2079 return
2080
2081 # The race condition can still happen if the race condition
2082 # described above happens between the returncode test
2083 # and the kill() call.
Filipe Laíns01a202a2020-11-21 09:22:08 +00002084 try:
2085 os.kill(self.pid, sig)
2086 except ProcessLookupError:
2087 # Supress the race condition error; bpo-40550.
2088 pass
Christian Heimesa342c012008-04-20 21:01:16 +00002089
2090 def terminate(self):
2091 """Terminate the process with SIGTERM
2092 """
2093 self.send_signal(signal.SIGTERM)
2094
2095 def kill(self):
2096 """Kill the process with SIGKILL
2097 """
2098 self.send_signal(signal.SIGKILL)