blob: aa107cb60e461f2d836d21260856654ea3c84c7a [file] [log] [blame]
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001# subprocess - Subprocesses with accessible I/O streams
2#
Tim Peterse718f612004-10-12 21:51:32 +00003# For more information about this module, see PEP 324.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00004#
Peter Astrand3a708df2005-09-23 17:37:29 +00005# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se>
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00006#
Peter Astrand69bf13f2005-02-14 08:56:32 +00007# Licensed to PSF under a Contributor Agreement.
Peter Astrand3a708df2005-09-23 17:37:29 +00008# See http://www.python.org/2.4/license for licensing details.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00009
Martin Panter4afdca02016-10-25 22:20:48 +000010r"""Subprocesses with accessible I/O streams
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000011
Fredrik Lundh15aaacc2004-10-17 14:47:05 +000012This module allows you to spawn processes, connect to their
Martin Panter4afdca02016-10-25 22:20:48 +000013input/output/error pipes, and obtain their return codes.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000014
Martin Panter4afdca02016-10-25 22:20:48 +000015For a complete description of this module see the Python documentation.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000016
Martin Panter4afdca02016-10-25 22:20:48 +000017Main API
18========
19run(...): Runs a command, waits for it to complete, then returns a
20 CompletedProcess instance.
21Popen(...): A class for flexibly executing a command in a new process
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000022
Martin Panter4afdca02016-10-25 22:20:48 +000023Constants
24---------
25DEVNULL: Special value that indicates that os.devnull should be used
26PIPE: Special value that indicates a pipe should be created
27STDOUT: Special value that indicates that stderr should go to stdout
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000028
29
Martin Panter4afdca02016-10-25 22:20:48 +000030Older API
31=========
32call(...): Runs a command, waits for it to complete, then returns
33 the return code.
34check_call(...): Same as call() but raises CalledProcessError()
35 if return code is not 0
36check_output(...): Same as check_call() but returns the contents of
37 stdout instead of a return code
38getoutput(...): Runs a command in the shell, waits for it to complete,
39 then returns the output
40getstatusoutput(...): Runs a command in the shell, waits for it to complete,
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -070041 then returns a (exitcode, output) tuple
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000042"""
43
Zachary Ware880d42a2018-09-10 16:16:08 -070044import builtins
45import errno
Guido van Rossumfa0054a2007-05-24 04:05:35 +000046import io
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000047import os
Reid Kleckner31aa7dd2011-03-14 12:02:10 -040048import time
Christian Heimesa342c012008-04-20 21:01:16 +000049import signal
Zachary Ware880d42a2018-09-10 16:16:08 -070050import sys
51import threading
Gregory P. Smithd23047b2010-12-04 09:10:44 +000052import warnings
Giampaolo Rodolabafa8482019-01-29 22:14:24 +010053import contextlib
Victor Stinnerae586492014-09-02 23:18:25 +020054from time import monotonic as _time
Guido van Rossum48b069a2020-04-07 09:50:06 -070055import types
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000056
Patrick McLean2b2ead72019-09-12 10:15:44 -070057try:
58 import pwd
59except ImportError:
60 pwd = None
61try:
62 import grp
63except ImportError:
64 grp = None
Ruben Vorderman23c0fb82020-10-20 01:30:02 +020065try:
66 import fcntl
67except ImportError:
68 fcntl = None
69
Zachary Ware880d42a2018-09-10 16:16:08 -070070
71__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput",
72 "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL",
73 "SubprocessError", "TimeoutExpired", "CompletedProcess"]
74 # NOTE: We intentionally exclude list2cmdline as it is
75 # considered an internal implementation detail. issue10838.
76
77try:
78 import msvcrt
79 import _winapi
80 _mswindows = True
81except ModuleNotFoundError:
82 _mswindows = False
83 import _posixsubprocess
84 import select
85 import selectors
86else:
87 from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
88 STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
89 STD_ERROR_HANDLE, SW_HIDE,
90 STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW,
91 ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
92 HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
93 NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
94 CREATE_NO_WINDOW, DETACHED_PROCESS,
95 CREATE_DEFAULT_ERROR_MODE, CREATE_BREAKAWAY_FROM_JOB)
96
97 __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP",
98 "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
99 "STD_ERROR_HANDLE", "SW_HIDE",
100 "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW",
101 "STARTUPINFO",
102 "ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
103 "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
104 "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS",
105 "CREATE_NO_WINDOW", "DETACHED_PROCESS",
106 "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"])
107
108
Peter Astrand454f7672005-01-01 09:36:35 +0000109# Exception classes used by this module.
Gregory P. Smith54d412e2011-03-14 14:08:43 -0400110class SubprocessError(Exception): pass
111
112
113class CalledProcessError(SubprocessError):
Martin Panter4afdca02016-10-25 22:20:48 +0000114 """Raised when run() is called with check=True and the process
115 returns a non-zero exit status.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)d6da7602016-06-03 06:14:06 +0000116
Martin Panter4afdca02016-10-25 22:20:48 +0000117 Attributes:
118 cmd, returncode, stdout, stderr, output
Georg Brandlf9734072008-12-07 15:30:06 +0000119 """
Gregory P. Smith6e730002015-04-14 16:14:25 -0700120 def __init__(self, returncode, cmd, output=None, stderr=None):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000121 self.returncode = returncode
122 self.cmd = cmd
Georg Brandlf9734072008-12-07 15:30:06 +0000123 self.output = output
Gregory P. Smith6e730002015-04-14 16:14:25 -0700124 self.stderr = stderr
125
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000126 def __str__(self):
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)d6da7602016-06-03 06:14:06 +0000127 if self.returncode and self.returncode < 0:
128 try:
129 return "Command '%s' died with %r." % (
130 self.cmd, signal.Signals(-self.returncode))
131 except ValueError:
132 return "Command '%s' died with unknown signal %d." % (
133 self.cmd, -self.returncode)
134 else:
135 return "Command '%s' returned non-zero exit status %d." % (
136 self.cmd, self.returncode)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000137
Gregory P. Smith6e730002015-04-14 16:14:25 -0700138 @property
139 def stdout(self):
140 """Alias for output attribute, to match stderr"""
141 return self.output
142
143 @stdout.setter
144 def stdout(self, value):
145 # There's no obvious reason to set this, but allow it anyway so
146 # .stdout is a transparent alias for .output
147 self.output = value
148
Peter Astrand454f7672005-01-01 09:36:35 +0000149
Gregory P. Smith54d412e2011-03-14 14:08:43 -0400150class TimeoutExpired(SubprocessError):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400151 """This exception is raised when the timeout expires while waiting for a
152 child process.
Martin Panter4afdca02016-10-25 22:20:48 +0000153
154 Attributes:
155 cmd, output, stdout, stderr, timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400156 """
Gregory P. Smith6e730002015-04-14 16:14:25 -0700157 def __init__(self, cmd, timeout, output=None, stderr=None):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400158 self.cmd = cmd
Reid Kleckner2b228f02011-03-16 16:57:54 -0400159 self.timeout = timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400160 self.output = output
Gregory P. Smith6e730002015-04-14 16:14:25 -0700161 self.stderr = stderr
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400162
163 def __str__(self):
164 return ("Command '%s' timed out after %s seconds" %
165 (self.cmd, self.timeout))
166
Gregory P. Smith6e730002015-04-14 16:14:25 -0700167 @property
168 def stdout(self):
169 return self.output
170
171 @stdout.setter
172 def stdout(self, value):
173 # There's no obvious reason to set this, but allow it anyway so
174 # .stdout is a transparent alias for .output
175 self.output = value
176
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400177
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700178if _mswindows:
Brian Curtin1ce6b582010-04-24 16:19:22 +0000179 class STARTUPINFO:
Subhendu Ghoshae160bb2017-02-25 20:29:05 +0530180 def __init__(self, *, dwFlags=0, hStdInput=None, hStdOutput=None,
Segev Finerb2a60832017-12-18 11:28:19 +0200181 hStdError=None, wShowWindow=0, lpAttributeList=None):
Subhendu Ghoshae160bb2017-02-25 20:29:05 +0530182 self.dwFlags = dwFlags
183 self.hStdInput = hStdInput
184 self.hStdOutput = hStdOutput
185 self.hStdError = hStdError
186 self.wShowWindow = wShowWindow
Segev Finerb2a60832017-12-18 11:28:19 +0200187 self.lpAttributeList = lpAttributeList or {"handle_list": []}
Victor Stinner483422f2018-07-05 22:54:17 +0200188
189 def copy(self):
190 attr_list = self.lpAttributeList.copy()
191 if 'handle_list' in attr_list:
192 attr_list['handle_list'] = list(attr_list['handle_list'])
193
194 return STARTUPINFO(dwFlags=self.dwFlags,
195 hStdInput=self.hStdInput,
196 hStdOutput=self.hStdOutput,
197 hStdError=self.hStdError,
198 wShowWindow=self.wShowWindow,
199 lpAttributeList=attr_list)
200
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200201
202 class Handle(int):
203 closed = False
204
205 def Close(self, CloseHandle=_winapi.CloseHandle):
206 if not self.closed:
207 self.closed = True
208 CloseHandle(self)
209
210 def Detach(self):
211 if not self.closed:
212 self.closed = True
213 return int(self)
214 raise ValueError("already closed")
215
216 def __repr__(self):
Serhiy Storchaka465e60e2014-07-25 23:36:00 +0300217 return "%s(%d)" % (self.__class__.__name__, int(self))
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200218
219 __del__ = Close
Zachary Ware880d42a2018-09-10 16:16:08 -0700220else:
221 # When select or poll has indicated that the file is writable,
222 # we can write up to _PIPE_BUF bytes without risk of blocking.
223 # POSIX defines PIPE_BUF as >= 512.
224 _PIPE_BUF = getattr(select, 'PIPE_BUF', 512)
225
226 # poll/select have the advantage of not requiring any extra file
227 # descriptor, contrarily to epoll/kqueue (also, they require a single
228 # syscall).
229 if hasattr(selectors, 'PollSelector'):
230 _PopenSelector = selectors.PollSelector
231 else:
232 _PopenSelector = selectors.SelectSelector
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200233
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000234
Ruslan Kuprieiev042821a2019-06-28 19:12:16 +0300235if _mswindows:
236 # On Windows we just need to close `Popen._handle` when we no longer need
237 # it, so that the kernel can free it. `Popen._handle` gets closed
238 # implicitly when the `Popen` instance is finalized (see `Handle.__del__`,
239 # which is calling `CloseHandle` as requested in [1]), so there is nothing
240 # for `_cleanup` to do.
241 #
242 # [1] https://docs.microsoft.com/en-us/windows/desktop/ProcThread/
243 # creating-processes
244 _active = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000245
Ruslan Kuprieiev042821a2019-06-28 19:12:16 +0300246 def _cleanup():
247 pass
248else:
249 # This lists holds Popen instances for which the underlying process had not
250 # exited at the time its __del__ method got called: those processes are
251 # wait()ed for synchronously from _cleanup() when a new Popen object is
252 # created, to avoid zombie processes.
253 _active = []
254
255 def _cleanup():
256 if _active is None:
257 return
258 for inst in _active[:]:
259 res = inst._internal_poll(_deadstate=sys.maxsize)
260 if res is not None:
261 try:
262 _active.remove(inst)
263 except ValueError:
264 # This can happen if two threads create a new Popen instance.
265 # It's harmless that it was already removed, so ignore.
266 pass
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000267
268PIPE = -1
269STDOUT = -2
Ross Lagerwallba102ec2011-03-16 18:40:25 +0200270DEVNULL = -3
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000271
272
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200273# XXX This function is only used by multiprocessing and the test suite,
274# but it's here so that it can be imported when Python is compiled without
275# threads.
276
Victor Stinner9def2842016-01-18 12:15:08 +0100277def _optim_args_from_interpreter_flags():
278 """Return a list of command-line arguments reproducing the current
279 optimization settings in sys.flags."""
280 args = []
281 value = sys.flags.optimize
282 if value > 0:
283 args.append('-' + 'O' * value)
284 return args
285
286
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200287def _args_from_interpreter_flags():
288 """Return a list of command-line arguments reproducing the current
Victor Stinner747f48e2017-12-12 22:59:48 +0100289 settings in sys.flags, sys.warnoptions and sys._xoptions."""
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200290 flag_opt_map = {
291 'debug': 'd',
292 # 'inspect': 'i',
293 # 'interactive': 'i',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200294 'dont_write_bytecode': 'B',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200295 'no_site': 'S',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200296 'verbose': 'v',
297 'bytes_warning': 'b',
298 'quiet': 'q',
Victor Stinner9def2842016-01-18 12:15:08 +0100299 # -O is handled in _optim_args_from_interpreter_flags()
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200300 }
Victor Stinner9def2842016-01-18 12:15:08 +0100301 args = _optim_args_from_interpreter_flags()
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200302 for flag, opt in flag_opt_map.items():
303 v = getattr(sys.flags, flag)
304 if v > 0:
305 args.append('-' + opt * v)
Victor Stinnerf39b6742017-11-20 15:24:56 -0800306
Victor Stinner9de36322018-11-23 17:54:20 +0100307 if sys.flags.isolated:
308 args.append('-I')
309 else:
310 if sys.flags.ignore_environment:
311 args.append('-E')
312 if sys.flags.no_user_site:
313 args.append('-s')
314
Victor Stinnerf39b6742017-11-20 15:24:56 -0800315 # -W options
Victor Stinner747f48e2017-12-12 22:59:48 +0100316 warnopts = sys.warnoptions[:]
317 bytes_warning = sys.flags.bytes_warning
318 xoptions = getattr(sys, '_xoptions', {})
319 dev_mode = ('dev' in xoptions)
320
321 if bytes_warning > 1:
322 warnopts.remove("error::BytesWarning")
323 elif bytes_warning:
324 warnopts.remove("default::BytesWarning")
325 if dev_mode:
326 warnopts.remove('default')
327 for opt in warnopts:
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200328 args.append('-W' + opt)
Victor Stinnerf39b6742017-11-20 15:24:56 -0800329
330 # -X options
Victor Stinner747f48e2017-12-12 22:59:48 +0100331 if dev_mode:
Victor Stinnerf39b6742017-11-20 15:24:56 -0800332 args.extend(('-X', 'dev'))
333 for opt in ('faulthandler', 'tracemalloc', 'importtime',
Pablo Galindo1ed83ad2020-06-11 17:30:46 +0100334 'showrefcount', 'utf8'):
Victor Stinnerf39b6742017-11-20 15:24:56 -0800335 if opt in xoptions:
336 value = xoptions[opt]
337 if value is True:
338 arg = opt
339 else:
340 arg = '%s=%s' % (opt, value)
341 args.extend(('-X', arg))
342
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200343 return args
344
345
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400346def call(*popenargs, timeout=None, **kwargs):
347 """Run command with arguments. Wait for command to complete or
348 timeout, then return the returncode attribute.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000349
350 The arguments are the same as for the Popen constructor. Example:
351
352 retcode = call(["ls", "-l"])
353 """
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200354 with Popen(*popenargs, **kwargs) as p:
355 try:
356 return p.wait(timeout=timeout)
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800357 except: # Including KeyboardInterrupt, wait handled that.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200358 p.kill()
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800359 # We don't call p.wait() again as p.__exit__ does that for us.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200360 raise
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000361
362
Peter Astrand454f7672005-01-01 09:36:35 +0000363def check_call(*popenargs, **kwargs):
364 """Run command with arguments. Wait for command to complete. If
365 the exit code was zero then return, otherwise raise
366 CalledProcessError. The CalledProcessError object will have the
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000367 return code in the returncode attribute.
Peter Astrand454f7672005-01-01 09:36:35 +0000368
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400369 The arguments are the same as for the call function. Example:
Peter Astrand454f7672005-01-01 09:36:35 +0000370
371 check_call(["ls", "-l"])
372 """
373 retcode = call(*popenargs, **kwargs)
Peter Astrand454f7672005-01-01 09:36:35 +0000374 if retcode:
Georg Brandlf9734072008-12-07 15:30:06 +0000375 cmd = kwargs.get("args")
376 if cmd is None:
377 cmd = popenargs[0]
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000378 raise CalledProcessError(retcode, cmd)
Georg Brandlf9734072008-12-07 15:30:06 +0000379 return 0
380
381
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400382def check_output(*popenargs, timeout=None, **kwargs):
Gregory P. Smith91110f52013-03-19 23:25:16 -0700383 r"""Run command with arguments and return its output.
Georg Brandlf9734072008-12-07 15:30:06 +0000384
385 If the exit code was non-zero it raises a CalledProcessError. The
386 CalledProcessError object will have the return code in the returncode
387 attribute and output in the output attribute.
388
389 The arguments are the same as for the Popen constructor. Example:
390
391 >>> check_output(["ls", "-l", "/dev/null"])
Georg Brandl2708f3a2009-12-20 14:38:23 +0000392 b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
Georg Brandlf9734072008-12-07 15:30:06 +0000393
394 The stdout argument is not allowed as it is used internally.
Georg Brandl127d4702009-12-28 08:10:38 +0000395 To capture standard error in the result, use stderr=STDOUT.
Georg Brandlf9734072008-12-07 15:30:06 +0000396
397 >>> check_output(["/bin/sh", "-c",
Georg Brandl2708f3a2009-12-20 14:38:23 +0000398 ... "ls -l non_existent_file ; exit 0"],
Georg Brandl127d4702009-12-28 08:10:38 +0000399 ... stderr=STDOUT)
Georg Brandl2708f3a2009-12-20 14:38:23 +0000400 b'ls: non_existent_file: No such file or directory\n'
Gregory P. Smith91110f52013-03-19 23:25:16 -0700401
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300402 There is an additional optional argument, "input", allowing you to
403 pass a string to the subprocess's stdin. If you use this argument
404 you may not also use the Popen constructor's "stdin" argument, as
405 it too will be used internally. Example:
406
407 >>> check_output(["sed", "-e", "s/foo/bar/"],
408 ... input=b"when in the course of fooman events\n")
409 b'when in the course of barman events\n'
410
andyclegg7fed7bd2017-10-23 03:01:19 +0100411 By default, all communication is in bytes, and therefore any "input"
Matthias182e1d12019-09-10 15:51:09 +0200412 should be bytes, and the return value will be bytes. If in text mode,
andyclegg7fed7bd2017-10-23 03:01:19 +0100413 any "input" should be a string, and the return value will be a string
414 decoded according to locale encoding, or by "encoding" if set. Text mode
415 is triggered by setting any of text, encoding, errors or universal_newlines.
Georg Brandlf9734072008-12-07 15:30:06 +0000416 """
417 if 'stdout' in kwargs:
418 raise ValueError('stdout argument not allowed, it will be overridden.')
Gregory P. Smith6e730002015-04-14 16:14:25 -0700419
420 if 'input' in kwargs and kwargs['input'] is None:
421 # Explicitly passing input=None was previously equivalent to passing an
422 # empty string. That is maintained here for backwards compatibility.
Gregory P. Smith64abf372020-12-24 20:57:21 -0800423 if kwargs.get('universal_newlines') or kwargs.get('text'):
424 empty = ''
425 else:
426 empty = b''
427 kwargs['input'] = empty
Gregory P. Smith6e730002015-04-14 16:14:25 -0700428
429 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
430 **kwargs).stdout
431
432
433class CompletedProcess(object):
434 """A process that has finished running.
435
436 This is returned by run().
437
438 Attributes:
439 args: The list or str args passed to run().
440 returncode: The exit code of the process, negative for signals.
441 stdout: The standard output (None if not captured).
442 stderr: The standard error (None if not captured).
443 """
444 def __init__(self, args, returncode, stdout=None, stderr=None):
445 self.args = args
446 self.returncode = returncode
447 self.stdout = stdout
448 self.stderr = stderr
449
450 def __repr__(self):
451 args = ['args={!r}'.format(self.args),
452 'returncode={!r}'.format(self.returncode)]
453 if self.stdout is not None:
454 args.append('stdout={!r}'.format(self.stdout))
455 if self.stderr is not None:
456 args.append('stderr={!r}'.format(self.stderr))
457 return "{}({})".format(type(self).__name__, ', '.join(args))
458
Guido van Rossum48b069a2020-04-07 09:50:06 -0700459 __class_getitem__ = classmethod(types.GenericAlias)
Batuhan Taşkaya4dc5a9d2019-12-30 19:02:04 +0300460
461
Gregory P. Smith6e730002015-04-14 16:14:25 -0700462 def check_returncode(self):
463 """Raise CalledProcessError if the exit code is non-zero."""
464 if self.returncode:
465 raise CalledProcessError(self.returncode, self.args, self.stdout,
466 self.stderr)
467
468
Bo Baylesce0f33d2018-01-30 00:40:39 -0600469def run(*popenargs,
470 input=None, capture_output=False, timeout=None, check=False, **kwargs):
Gregory P. Smith6e730002015-04-14 16:14:25 -0700471 """Run command with arguments and return a CompletedProcess instance.
472
473 The returned instance will have attributes args, returncode, stdout and
474 stderr. By default, stdout and stderr are not captured, and those attributes
475 will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them.
476
477 If check is True and the exit code was non-zero, it raises a
478 CalledProcessError. The CalledProcessError object will have the return code
479 in the returncode attribute, and output & stderr attributes if those streams
480 were captured.
481
482 If timeout is given, and the process takes too long, a TimeoutExpired
483 exception will be raised.
484
485 There is an optional argument "input", allowing you to
andyclegg7fed7bd2017-10-23 03:01:19 +0100486 pass bytes or a string to the subprocess's stdin. If you use this argument
Gregory P. Smith6e730002015-04-14 16:14:25 -0700487 you may not also use the Popen constructor's "stdin" argument, as
488 it will be used internally.
489
andyclegg7fed7bd2017-10-23 03:01:19 +0100490 By default, all communication is in bytes, and therefore any "input" should
491 be bytes, and the stdout and stderr will be bytes. If in text mode, any
492 "input" should be a string, and stdout and stderr will be strings decoded
493 according to locale encoding, or by "encoding" if set. Text mode is
494 triggered by setting any of text, encoding, errors or universal_newlines.
Gregory P. Smith6e730002015-04-14 16:14:25 -0700495
andyclegg7fed7bd2017-10-23 03:01:19 +0100496 The other arguments are the same as for the Popen constructor.
Gregory P. Smith6e730002015-04-14 16:14:25 -0700497 """
498 if input is not None:
Rémi Lapeyre8cc605a2019-06-08 16:56:24 +0200499 if kwargs.get('stdin') is not None:
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300500 raise ValueError('stdin and input arguments may not both be used.')
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300501 kwargs['stdin'] = PIPE
Gregory P. Smith6e730002015-04-14 16:14:25 -0700502
Bo Baylesce0f33d2018-01-30 00:40:39 -0600503 if capture_output:
Rémi Lapeyre8cc605a2019-06-08 16:56:24 +0200504 if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None:
Bo Baylesce0f33d2018-01-30 00:40:39 -0600505 raise ValueError('stdout and stderr arguments may not be used '
506 'with capture_output.')
507 kwargs['stdout'] = PIPE
508 kwargs['stderr'] = PIPE
509
Gregory P. Smith6e730002015-04-14 16:14:25 -0700510 with Popen(*popenargs, **kwargs) as process:
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200511 try:
Gregory P. Smith6e730002015-04-14 16:14:25 -0700512 stdout, stderr = process.communicate(input, timeout=timeout)
Gregory P. Smith580d2782019-09-11 04:23:05 -0500513 except TimeoutExpired as exc:
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200514 process.kill()
Gregory P. Smith580d2782019-09-11 04:23:05 -0500515 if _mswindows:
516 # Windows accumulates the output in a single blocking
517 # read() call run on child threads, with the timeout
518 # being done in a join() on those threads. communicate()
519 # _after_ kill() is required to collect that and add it
520 # to the exception.
521 exc.stdout, exc.stderr = process.communicate()
522 else:
523 # POSIX _communicate already populated the output so
524 # far into the TimeoutExpired exception.
525 process.wait()
526 raise
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800527 except: # Including KeyboardInterrupt, communicate handled that.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200528 process.kill()
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800529 # We don't call process.wait() as .__exit__ does that for us.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200530 raise
531 retcode = process.poll()
Gregory P. Smith6e730002015-04-14 16:14:25 -0700532 if check and retcode:
533 raise CalledProcessError(retcode, process.args,
534 output=stdout, stderr=stderr)
535 return CompletedProcess(process.args, retcode, stdout, stderr)
Peter Astrand454f7672005-01-01 09:36:35 +0000536
537
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000538def list2cmdline(seq):
539 """
540 Translate a sequence of arguments into a command line
541 string, using the same rules as the MS C runtime:
542
543 1) Arguments are delimited by white space, which is either a
544 space or a tab.
545
546 2) A string surrounded by double quotation marks is
547 interpreted as a single argument, regardless of white space
Jean-Paul Calderone1ddd4072010-06-18 20:03:54 +0000548 contained within. A quoted string can be embedded in an
549 argument.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000550
551 3) A double quotation mark preceded by a backslash is
552 interpreted as a literal double quotation mark.
553
554 4) Backslashes are interpreted literally, unless they
555 immediately precede a double quotation mark.
556
557 5) If backslashes immediately precede a double quotation mark,
558 every pair of backslashes is interpreted as a literal
559 backslash. If the number of backslashes is odd, the last
560 backslash escapes the next double quotation mark as
561 described in rule 3.
562 """
563
564 # See
Eric Smith3c573af2009-11-09 15:23:15 +0000565 # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
566 # or search http://msdn.microsoft.com for
567 # "Parsing C++ Command-Line Arguments"
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000568 result = []
569 needquote = False
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +0300570 for arg in map(os.fsdecode, seq):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000571 bs_buf = []
572
573 # Add a space to separate this argument from the others
574 if result:
575 result.append(' ')
576
Jean-Paul Calderone1ddd4072010-06-18 20:03:54 +0000577 needquote = (" " in arg) or ("\t" in arg) or not arg
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000578 if needquote:
579 result.append('"')
580
581 for c in arg:
582 if c == '\\':
Tim Peterse718f612004-10-12 21:51:32 +0000583 # Don't know if we need to double yet.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000584 bs_buf.append(c)
585 elif c == '"':
Christian Heimesfdab48e2008-01-20 09:06:41 +0000586 # Double backslashes.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000587 result.append('\\' * len(bs_buf)*2)
588 bs_buf = []
589 result.append('\\"')
590 else:
591 # Normal char
592 if bs_buf:
593 result.extend(bs_buf)
594 bs_buf = []
595 result.append(c)
596
Christian Heimesfdab48e2008-01-20 09:06:41 +0000597 # Add remaining backslashes, if any.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000598 if bs_buf:
599 result.extend(bs_buf)
600
601 if needquote:
Peter Astrand7e78ade2005-03-03 21:10:23 +0000602 result.extend(bs_buf)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000603 result.append('"')
604
605 return ''.join(result)
606
607
Brett Cannona23810f2008-05-26 19:04:21 +0000608# Various tools for executing commands and looking at their output and status.
609#
Brett Cannona23810f2008-05-26 19:04:21 +0000610
611def getstatusoutput(cmd):
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700612 """Return (exitcode, output) of executing cmd in a shell.
Brett Cannona23810f2008-05-26 19:04:21 +0000613
Tim Golden60798142013-11-05 12:57:25 +0000614 Execute the string 'cmd' in a shell with 'check_output' and
Steve Dower050acae2016-09-06 20:16:17 -0700615 return a 2-tuple (status, output). The locale encoding is used
616 to decode the output and process newlines.
Tim Golden60798142013-11-05 12:57:25 +0000617
618 A trailing newline is stripped from the output.
619 The exit status for the command can be interpreted
620 according to the rules for the function 'wait'. Example:
Brett Cannona23810f2008-05-26 19:04:21 +0000621
622 >>> import subprocess
623 >>> subprocess.getstatusoutput('ls /bin/ls')
624 (0, '/bin/ls')
625 >>> subprocess.getstatusoutput('cat /bin/junk')
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700626 (1, 'cat: /bin/junk: No such file or directory')
Brett Cannona23810f2008-05-26 19:04:21 +0000627 >>> subprocess.getstatusoutput('/bin/junk')
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700628 (127, 'sh: /bin/junk: not found')
629 >>> subprocess.getstatusoutput('/bin/kill $$')
630 (-15, '')
Brett Cannona23810f2008-05-26 19:04:21 +0000631 """
Tim Goldene0041752013-11-03 12:53:17 +0000632 try:
andyclegg7fed7bd2017-10-23 03:01:19 +0100633 data = check_output(cmd, shell=True, text=True, stderr=STDOUT)
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700634 exitcode = 0
Tim Goldene0041752013-11-03 12:53:17 +0000635 except CalledProcessError as ex:
636 data = ex.output
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700637 exitcode = ex.returncode
Tim Goldene0041752013-11-03 12:53:17 +0000638 if data[-1:] == '\n':
639 data = data[:-1]
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700640 return exitcode, data
Brett Cannona23810f2008-05-26 19:04:21 +0000641
642def getoutput(cmd):
643 """Return output (stdout or stderr) of executing cmd in a shell.
644
645 Like getstatusoutput(), except the exit status is ignored and the return
646 value is a string containing the command's output. Example:
647
648 >>> import subprocess
649 >>> subprocess.getoutput('ls /bin/ls')
650 '/bin/ls'
651 """
652 return getstatusoutput(cmd)[1]
653
654
Victor Stinner9daecf32019-01-16 00:02:35 +0100655def _use_posix_spawn():
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800656 """Check if posix_spawn() can be used for subprocess.
Victor Stinner9daecf32019-01-16 00:02:35 +0100657
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800658 subprocess requires a posix_spawn() implementation that properly reports
659 errors to the parent process, & sets errno on the following failures:
Victor Stinner9daecf32019-01-16 00:02:35 +0100660
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800661 * Process attribute actions failed.
662 * File actions failed.
663 * exec() failed.
Victor Stinner9daecf32019-01-16 00:02:35 +0100664
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800665 Prefer an implementation which can use vfork() in some cases for best
666 performance.
Victor Stinner9daecf32019-01-16 00:02:35 +0100667 """
668 if _mswindows or not hasattr(os, 'posix_spawn'):
669 # os.posix_spawn() is not available
670 return False
671
672 if sys.platform == 'darwin':
673 # posix_spawn() is a syscall on macOS and properly reports errors
674 return True
675
676 # Check libc name and runtime libc version
677 try:
678 ver = os.confstr('CS_GNU_LIBC_VERSION')
679 # parse 'glibc 2.28' as ('glibc', (2, 28))
680 parts = ver.split(maxsplit=1)
681 if len(parts) != 2:
682 # reject unknown format
683 raise ValueError
684 libc = parts[0]
685 version = tuple(map(int, parts[1].split('.')))
686
687 if sys.platform == 'linux' and libc == 'glibc' and version >= (2, 24):
688 # glibc 2.24 has a new Linux posix_spawn implementation using vfork
689 # which properly reports errors to the parent process.
690 return True
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800691 # Note: Don't use the implementation in earlier glibc because it doesn't
Victor Stinner9daecf32019-01-16 00:02:35 +0100692 # use vfork (even if glibc 2.26 added a pipe to properly report errors
693 # to the parent process).
694 except (AttributeError, ValueError, OSError):
695 # os.confstr() or CS_GNU_LIBC_VERSION value not available
696 pass
697
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800698 # By default, assume that posix_spawn() does not properly report errors.
Victor Stinner9daecf32019-01-16 00:02:35 +0100699 return False
700
701
702_USE_POSIX_SPAWN = _use_posix_spawn()
703
704
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000705class Popen(object):
Martin Panter4afdca02016-10-25 22:20:48 +0000706 """ Execute a child program in a new process.
Serhiy Storchaka72e77612014-02-10 19:20:22 +0200707
Martin Panter4afdca02016-10-25 22:20:48 +0000708 For a complete description of the arguments see the Python documentation.
709
710 Arguments:
711 args: A string, or a sequence of program arguments.
712
713 bufsize: supplied as the buffering argument to the open() function when
714 creating the stdin/stdout/stderr pipe file objects
715
716 executable: A replacement program to execute.
717
718 stdin, stdout and stderr: These specify the executed programs' standard
719 input, standard output and standard error file handles, respectively.
720
721 preexec_fn: (POSIX only) An object to be called in the child process
722 just before the child is executed.
723
724 close_fds: Controls closing or inheriting of file descriptors.
725
726 shell: If true, the command will be executed through the shell.
727
728 cwd: Sets the current directory before the child is executed.
729
730 env: Defines the environment variables for the new process.
731
andyclegg7fed7bd2017-10-23 03:01:19 +0100732 text: If true, decode stdin, stdout and stderr using the given encoding
733 (if set) or the system default otherwise.
734
735 universal_newlines: Alias of text, provided for backwards compatibility.
Martin Panter4afdca02016-10-25 22:20:48 +0000736
737 startupinfo and creationflags (Windows only)
738
739 restore_signals (POSIX only)
740
741 start_new_session (POSIX only)
742
Patrick McLean2b2ead72019-09-12 10:15:44 -0700743 group (POSIX only)
744
745 extra_groups (POSIX only)
746
747 user (POSIX only)
748
Gregory P. Smithf3751ef2019-10-12 13:24:56 -0700749 umask (POSIX only)
750
Martin Panter4afdca02016-10-25 22:20:48 +0000751 pass_fds (POSIX only)
752
Martin Panter3dca6242016-10-25 23:41:42 +0000753 encoding and errors: Text mode encoding and error handling to use for
754 file objects stdin, stdout and stderr.
755
Martin Panter4afdca02016-10-25 22:20:48 +0000756 Attributes:
757 stdin, stdout, stderr, pid, returncode
758 """
Serhiy Storchaka72e77612014-02-10 19:20:22 +0200759 _child_created = False # Set here since __del__ checks it
760
Gregory P. Smitha1ed5392013-03-23 11:44:25 -0700761 def __init__(self, args, bufsize=-1, executable=None,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000762 stdin=None, stdout=None, stderr=None,
Segev Finerb2a60832017-12-18 11:28:19 +0200763 preexec_fn=None, close_fds=True,
andyclegg7fed7bd2017-10-23 03:01:19 +0100764 shell=False, cwd=None, env=None, universal_newlines=None,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000765 startupinfo=None, creationflags=0,
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000766 restore_signals=True, start_new_session=False,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700767 pass_fds=(), *, user=None, group=None, extra_groups=None,
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200768 encoding=None, errors=None, text=None, umask=-1, pipesize=-1):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000769 """Create new Popen instance."""
770 _cleanup()
Gregory P. Smithd65ba512014-04-23 00:27:17 -0700771 # Held while anything is calling waitpid before returncode has been
772 # updated to prevent clobbering returncode if wait() or poll() are
773 # called from multiple threads at once. After acquiring the lock,
774 # code must re-check self.returncode to see if another thread just
775 # finished a waitpid() call.
776 self._waitpid_lock = threading.Lock()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000777
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400778 self._input = None
779 self._communication_started = False
Guido van Rossum46a05a72007-06-07 21:56:45 +0000780 if bufsize is None:
Gregory P. Smitha1ed5392013-03-23 11:44:25 -0700781 bufsize = -1 # Restore default
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000782 if not isinstance(bufsize, int):
Peter Astrand738131d2004-11-30 21:04:45 +0000783 raise TypeError("bufsize must be an integer")
784
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200785 if pipesize is None:
786 pipesize = -1 # Restore default
787 if not isinstance(pipesize, int):
788 raise TypeError("pipesize must be an integer")
789
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700790 if _mswindows:
Tim Peterse8374a52004-10-13 03:15:00 +0000791 if preexec_fn is not None:
792 raise ValueError("preexec_fn is not supported on Windows "
793 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000794 else:
795 # POSIX
Gregory P. Smith8edd99d2010-12-14 13:43:30 +0000796 if pass_fds and not close_fds:
797 warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
798 close_fds = True
Tim Peterse8374a52004-10-13 03:15:00 +0000799 if startupinfo is not None:
800 raise ValueError("startupinfo is only supported on Windows "
801 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000802 if creationflags != 0:
Tim Peterse8374a52004-10-13 03:15:00 +0000803 raise ValueError("creationflags is only supported on Windows "
804 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000805
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400806 self.args = args
Tim Peterse718f612004-10-12 21:51:32 +0000807 self.stdin = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000808 self.stdout = None
809 self.stderr = None
810 self.pid = None
811 self.returncode = None
Steve Dower050acae2016-09-06 20:16:17 -0700812 self.encoding = encoding
813 self.errors = errors
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200814 self.pipesize = pipesize
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000815
andyclegg7fed7bd2017-10-23 03:01:19 +0100816 # Validate the combinations of text and universal_newlines
817 if (text is not None and universal_newlines is not None
818 and bool(universal_newlines) != bool(text)):
819 raise SubprocessError('Cannot disambiguate when both text '
820 'and universal_newlines are supplied but '
821 'different. Pass one or the other.')
822
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000823 # Input and output objects. The general principle is like
824 # this:
825 #
826 # Parent Child
827 # ------ -----
828 # p2cwrite ---stdin---> p2cread
829 # c2pread <--stdout--- c2pwrite
830 # errread <--stderr--- errwrite
831 #
832 # On POSIX, the child objects are file descriptors. On
833 # Windows, these are Windows file handles. The parent objects
834 # are file descriptors on both platforms. The parent objects
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000835 # are -1 when not using PIPEs. The child objects are -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000836 # when not redirecting.
Tim Peterse718f612004-10-12 21:51:32 +0000837
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000838 (p2cread, p2cwrite,
839 c2pread, c2pwrite,
840 errread, errwrite) = self._get_handles(stdin, stdout, stderr)
841
Antoine Pitrouc9982322011-01-04 19:07:07 +0000842 # We wrap OS handles *before* launching the child, otherwise a
843 # quickly terminating child could make our fds unwrappable
844 # (see #8458).
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000845
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700846 if _mswindows:
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000847 if p2cwrite != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000848 p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000849 if c2pread != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000850 c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000851 if errread != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000852 errread = msvcrt.open_osfhandle(errread.Detach(), 0)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000853
andyclegg7fed7bd2017-10-23 03:01:19 +0100854 self.text_mode = encoding or errors or text or universal_newlines
Tim Peterse718f612004-10-12 21:51:32 +0000855
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800856 # How long to resume waiting on a child after the first ^C.
857 # There is no right value for this. The purpose is to be polite
858 # yet remain good for interactive users trying to exit a tool.
859 self._sigint_wait_secs = 0.25 # 1/xkcd221.getRandomNumber()
860
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700861 self._closed_child_pipe_fds = False
Steve Dower050acae2016-09-06 20:16:17 -0700862
Alexey Izbysheva2670562018-10-20 03:22:31 +0300863 if self.text_mode:
864 if bufsize == 1:
865 line_buffering = True
866 # Use the default buffer size for the underlying binary streams
867 # since they don't support line buffering.
868 bufsize = -1
869 else:
870 line_buffering = False
871
Patrick McLean2b2ead72019-09-12 10:15:44 -0700872 gid = None
873 if group is not None:
874 if not hasattr(os, 'setregid'):
875 raise ValueError("The 'group' parameter is not supported on the "
876 "current platform")
877
878 elif isinstance(group, str):
879 if grp is None:
880 raise ValueError("The group parameter cannot be a string "
881 "on systems without the grp module")
882
883 gid = grp.getgrnam(group).gr_gid
884 elif isinstance(group, int):
885 gid = group
886 else:
887 raise TypeError("Group must be a string or an integer, not {}"
888 .format(type(group)))
889
890 if gid < 0:
891 raise ValueError(f"Group ID cannot be negative, got {gid}")
892
893 gids = None
894 if extra_groups is not None:
895 if not hasattr(os, 'setgroups'):
896 raise ValueError("The 'extra_groups' parameter is not "
897 "supported on the current platform")
898
899 elif isinstance(extra_groups, str):
900 raise ValueError("Groups must be a list, not a string")
901
902 gids = []
903 for extra_group in extra_groups:
904 if isinstance(extra_group, str):
905 if grp is None:
906 raise ValueError("Items in extra_groups cannot be "
907 "strings on systems without the "
908 "grp module")
909
910 gids.append(grp.getgrnam(extra_group).gr_gid)
911 elif isinstance(extra_group, int):
912 gids.append(extra_group)
913 else:
914 raise TypeError("Items in extra_groups must be a string "
915 "or integer, not {}"
916 .format(type(extra_group)))
917
918 # make sure that the gids are all positive here so we can do less
919 # checking in the C code
920 for gid_check in gids:
921 if gid_check < 0:
922 raise ValueError(f"Group ID cannot be negative, got {gid_check}")
923
924 uid = None
925 if user is not None:
926 if not hasattr(os, 'setreuid'):
927 raise ValueError("The 'user' parameter is not supported on "
928 "the current platform")
929
930 elif isinstance(user, str):
931 if pwd is None:
932 raise ValueError("The user parameter cannot be a string "
933 "on systems without the pwd module")
934
935 uid = pwd.getpwnam(user).pw_uid
936 elif isinstance(user, int):
937 uid = user
938 else:
939 raise TypeError("User must be a string or an integer")
940
941 if uid < 0:
942 raise ValueError(f"User ID cannot be negative, got {uid}")
943
Antoine Pitrouc9982322011-01-04 19:07:07 +0000944 try:
Steve Dower050acae2016-09-06 20:16:17 -0700945 if p2cwrite != -1:
946 self.stdin = io.open(p2cwrite, 'wb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100947 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700948 self.stdin = io.TextIOWrapper(self.stdin, write_through=True,
Alexey Izbysheva2670562018-10-20 03:22:31 +0300949 line_buffering=line_buffering,
Steve Dower050acae2016-09-06 20:16:17 -0700950 encoding=encoding, errors=errors)
951 if c2pread != -1:
952 self.stdout = io.open(c2pread, 'rb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100953 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700954 self.stdout = io.TextIOWrapper(self.stdout,
955 encoding=encoding, errors=errors)
956 if errread != -1:
957 self.stderr = io.open(errread, 'rb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100958 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700959 self.stderr = io.TextIOWrapper(self.stderr,
960 encoding=encoding, errors=errors)
961
Antoine Pitrouc9982322011-01-04 19:07:07 +0000962 self._execute_child(args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +0300963 pass_fds, cwd, env,
Antoine Pitrouc9982322011-01-04 19:07:07 +0000964 startupinfo, creationflags, shell,
965 p2cread, p2cwrite,
966 c2pread, c2pwrite,
967 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700968 restore_signals,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -0700969 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700970 start_new_session)
Antoine Pitrouc9982322011-01-04 19:07:07 +0000971 except:
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800972 # Cleanup if the child failed starting.
973 for f in filter(None, (self.stdin, self.stdout, self.stderr)):
Antoine Pitrouc9982322011-01-04 19:07:07 +0000974 try:
975 f.close()
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200976 except OSError:
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800977 pass # Ignore EBADF or other errors.
978
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700979 if not self._closed_child_pipe_fds:
980 to_close = []
981 if stdin == PIPE:
982 to_close.append(p2cread)
983 if stdout == PIPE:
984 to_close.append(c2pwrite)
985 if stderr == PIPE:
986 to_close.append(errwrite)
987 if hasattr(self, '_devnull'):
988 to_close.append(self._devnull)
989 for fd in to_close:
990 try:
Segev Finer4d385172017-08-18 16:18:13 +0300991 if _mswindows and isinstance(fd, Handle):
992 fd.Close()
993 else:
994 os.close(fd)
Gregory P. Smith22ba31a2013-06-15 18:14:56 -0700995 except OSError:
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700996 pass
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800997
Antoine Pitrouc9982322011-01-04 19:07:07 +0000998 raise
999
Andrey Doroschenko645005e2019-11-17 17:08:31 +03001000 def __repr__(self):
1001 obj_repr = (
1002 f"<{self.__class__.__name__}: "
1003 f"returncode: {self.returncode} args: {list(self.args)!r}>"
1004 )
1005 if len(obj_repr) > 80:
1006 obj_repr = obj_repr[:76] + "...>"
1007 return obj_repr
1008
Guido van Rossum48b069a2020-04-07 09:50:06 -07001009 __class_getitem__ = classmethod(types.GenericAlias)
Batuhan Taşkaya4dc5a9d2019-12-30 19:02:04 +03001010
andyclegg7fed7bd2017-10-23 03:01:19 +01001011 @property
1012 def universal_newlines(self):
1013 # universal_newlines as retained as an alias of text_mode for API
luzpaza5293b42017-11-05 07:37:50 -06001014 # compatibility. bpo-31756
andyclegg7fed7bd2017-10-23 03:01:19 +01001015 return self.text_mode
1016
1017 @universal_newlines.setter
1018 def universal_newlines(self, universal_newlines):
1019 self.text_mode = bool(universal_newlines)
1020
Steve Dower050acae2016-09-06 20:16:17 -07001021 def _translate_newlines(self, data, encoding, errors):
1022 data = data.decode(encoding, errors)
Andrew Svetlov82860712012-08-19 22:13:41 +03001023 return data.replace("\r\n", "\n").replace("\r", "\n")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001024
Brian Curtin79cdb662010-12-03 02:46:02 +00001025 def __enter__(self):
1026 return self
1027
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001028 def __exit__(self, exc_type, value, traceback):
Brian Curtin79cdb662010-12-03 02:46:02 +00001029 if self.stdout:
1030 self.stdout.close()
1031 if self.stderr:
1032 self.stderr.close()
Serhiy Storchakaab900c22015-02-28 12:43:08 +02001033 try: # Flushing a BufferedWriter may raise an error
1034 if self.stdin:
1035 self.stdin.close()
1036 finally:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001037 if exc_type == KeyboardInterrupt:
1038 # https://bugs.python.org/issue25942
1039 # In the case of a KeyboardInterrupt we assume the SIGINT
1040 # was also already sent to our child processes. We can't
1041 # block indefinitely as that is not user friendly.
1042 # If we have not already waited a brief amount of time in
1043 # an interrupted .wait() or .communicate() call, do so here
1044 # for consistency.
1045 if self._sigint_wait_secs > 0:
1046 try:
1047 self._wait(timeout=self._sigint_wait_secs)
1048 except TimeoutExpired:
1049 pass
1050 self._sigint_wait_secs = 0 # Note that this has been done.
1051 return # resume the KeyboardInterrupt
1052
Serhiy Storchakaab900c22015-02-28 12:43:08 +02001053 # Wait for the process to terminate, to avoid zombies.
1054 self.wait()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001055
Victor Stinner9505b032017-01-06 10:44:44 +01001056 def __del__(self, _maxsize=sys.maxsize, _warn=warnings.warn):
Serhiy Storchaka72e77612014-02-10 19:20:22 +02001057 if not self._child_created:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001058 # We didn't get to successfully create a child process.
1059 return
Victor Stinner5a48e212016-05-20 12:11:15 +02001060 if self.returncode is None:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001061 # Not reading subprocess exit status creates a zombie process which
Victor Stinnerc206f1e2016-06-14 16:42:59 +02001062 # is only destroyed at the parent python process exit
Victor Stinner9505b032017-01-06 10:44:44 +01001063 _warn("subprocess %s is still running" % self.pid,
1064 ResourceWarning, source=self)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001065 # In case the child hasn't been waited on, check if it's done.
Brett Cannon84df1e62010-05-14 00:33:40 +00001066 self._internal_poll(_deadstate=_maxsize)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001067 if self.returncode is None and _active is not None:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001068 # Child is still running, keep us alive until we can wait on it.
1069 _active.append(self)
1070
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001071 def _get_devnull(self):
1072 if not hasattr(self, '_devnull'):
1073 self._devnull = os.open(os.devnull, os.O_RDWR)
1074 return self._devnull
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001075
Victor Stinnera5e881d2015-01-14 17:07:59 +01001076 def _stdin_write(self, input):
1077 if input:
1078 try:
1079 self.stdin.write(input)
1080 except BrokenPipeError:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001081 pass # communicate() must ignore broken pipe errors.
Victor Stinnerd52aa312017-06-08 17:30:39 +02001082 except OSError as exc:
1083 if exc.errno == errno.EINVAL:
1084 # bpo-19612, bpo-30418: On Windows, stdin.write() fails
1085 # with EINVAL if the child process exited or if the child
1086 # process is still running but closed the pipe.
Victor Stinnera5e881d2015-01-14 17:07:59 +01001087 pass
1088 else:
1089 raise
Victor Stinnerd52aa312017-06-08 17:30:39 +02001090
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001091 try:
1092 self.stdin.close()
1093 except BrokenPipeError:
1094 pass # communicate() must ignore broken pipe errors.
Victor Stinnerd52aa312017-06-08 17:30:39 +02001095 except OSError as exc:
1096 if exc.errno == errno.EINVAL:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001097 pass
1098 else:
1099 raise
Victor Stinnera5e881d2015-01-14 17:07:59 +01001100
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001101 def communicate(self, input=None, timeout=None):
Joel Schaerer88031a92017-09-13 21:11:20 +02001102 """Interact with process: Send data to stdin and close it.
1103 Read data from stdout and stderr, until end-of-file is
1104 reached. Wait for process to terminate.
Tim Peterseba28be2005-03-28 01:08:02 +00001105
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001106 The optional "input" argument should be data to be sent to the
andyclegg7fed7bd2017-10-23 03:01:19 +01001107 child process, or None, if no data should be sent to the child.
1108 communicate() returns a tuple (stdout, stderr).
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001109
andyclegg7fed7bd2017-10-23 03:01:19 +01001110 By default, all communication is in bytes, and therefore any
1111 "input" should be bytes, and the (stdout, stderr) will be bytes.
1112 If in text mode (indicated by self.text_mode), any "input" should
1113 be a string, and (stdout, stderr) will be strings decoded
1114 according to locale encoding, or by "encoding" if set. Text mode
1115 is triggered by setting any of text, encoding, errors or
1116 universal_newlines.
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001117 """
Peter Astrand23109f02005-03-03 20:28:59 +00001118
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001119 if self._communication_started and input:
1120 raise ValueError("Cannot send input after starting communication")
1121
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001122 # Optimization: If we are not worried about timeouts, we haven't
1123 # started communicating, and we have one or zero pipes, using select()
1124 # or threads is unnecessary.
Victor Stinner7a8d0812011-04-05 13:13:08 +02001125 if (timeout is None and not self._communication_started and
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001126 [self.stdin, self.stdout, self.stderr].count(None) >= 2):
Tim Peterseba28be2005-03-28 01:08:02 +00001127 stdout = None
1128 stderr = None
Peter Astrand23109f02005-03-03 20:28:59 +00001129 if self.stdin:
Victor Stinnera5e881d2015-01-14 17:07:59 +01001130 self._stdin_write(input)
Peter Astrand23109f02005-03-03 20:28:59 +00001131 elif self.stdout:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001132 stdout = self.stdout.read()
Georg Brandlf08a9dd2008-06-10 16:57:31 +00001133 self.stdout.close()
Peter Astrand23109f02005-03-03 20:28:59 +00001134 elif self.stderr:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001135 stderr = self.stderr.read()
Georg Brandlf08a9dd2008-06-10 16:57:31 +00001136 self.stderr.close()
Peter Astrand23109f02005-03-03 20:28:59 +00001137 self.wait()
Victor Stinner7a8d0812011-04-05 13:13:08 +02001138 else:
1139 if timeout is not None:
Victor Stinner949d8c92012-05-30 13:30:32 +02001140 endtime = _time() + timeout
Victor Stinner7a8d0812011-04-05 13:13:08 +02001141 else:
1142 endtime = None
Tim Peterseba28be2005-03-28 01:08:02 +00001143
Victor Stinner7a8d0812011-04-05 13:13:08 +02001144 try:
1145 stdout, stderr = self._communicate(input, endtime, timeout)
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001146 except KeyboardInterrupt:
1147 # https://bugs.python.org/issue25942
1148 # See the detailed comment in .wait().
1149 if timeout is not None:
1150 sigint_timeout = min(self._sigint_wait_secs,
1151 self._remaining_time(endtime))
1152 else:
1153 sigint_timeout = self._sigint_wait_secs
1154 self._sigint_wait_secs = 0 # nothing else should wait.
1155 try:
1156 self._wait(timeout=sigint_timeout)
1157 except TimeoutExpired:
1158 pass
1159 raise # resume the KeyboardInterrupt
1160
Victor Stinner7a8d0812011-04-05 13:13:08 +02001161 finally:
1162 self._communication_started = True
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001163
Victor Stinner7a8d0812011-04-05 13:13:08 +02001164 sts = self.wait(timeout=self._remaining_time(endtime))
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001165
1166 return (stdout, stderr)
Peter Astrand23109f02005-03-03 20:28:59 +00001167
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001168
Georg Brandl6aa2d1f2008-08-12 08:35:52 +00001169 def poll(self):
Martin Panter4afdca02016-10-25 22:20:48 +00001170 """Check if child process has terminated. Set and return returncode
1171 attribute."""
Georg Brandl6aa2d1f2008-08-12 08:35:52 +00001172 return self._internal_poll()
1173
1174
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001175 def _remaining_time(self, endtime):
1176 """Convenience for _communicate when computing timeouts."""
1177 if endtime is None:
1178 return None
1179 else:
Victor Stinner949d8c92012-05-30 13:30:32 +02001180 return endtime - _time()
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001181
1182
Gregory P. Smith580d2782019-09-11 04:23:05 -05001183 def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq,
1184 skip_check_and_raise=False):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001185 """Convenience for checking if a timeout has expired."""
1186 if endtime is None:
1187 return
Gregory P. Smith580d2782019-09-11 04:23:05 -05001188 if skip_check_and_raise or _time() > endtime:
1189 raise TimeoutExpired(
1190 self.args, orig_timeout,
1191 output=b''.join(stdout_seq) if stdout_seq else None,
1192 stderr=b''.join(stderr_seq) if stderr_seq else None)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001193
1194
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001195 def wait(self, timeout=None):
1196 """Wait for child process to terminate; returns self.returncode."""
1197 if timeout is not None:
1198 endtime = _time() + timeout
1199 try:
1200 return self._wait(timeout=timeout)
1201 except KeyboardInterrupt:
1202 # https://bugs.python.org/issue25942
1203 # The first keyboard interrupt waits briefly for the child to
1204 # exit under the common assumption that it also received the ^C
1205 # generated SIGINT and will exit rapidly.
1206 if timeout is not None:
1207 sigint_timeout = min(self._sigint_wait_secs,
1208 self._remaining_time(endtime))
1209 else:
1210 sigint_timeout = self._sigint_wait_secs
1211 self._sigint_wait_secs = 0 # nothing else should wait.
1212 try:
1213 self._wait(timeout=sigint_timeout)
1214 except TimeoutExpired:
1215 pass
1216 raise # resume the KeyboardInterrupt
1217
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001218 def _close_pipe_fds(self,
1219 p2cread, p2cwrite,
1220 c2pread, c2pwrite,
1221 errread, errwrite):
1222 # self._devnull is not always defined.
1223 devnull_fd = getattr(self, '_devnull', None)
1224
Giampaolo Rodolabafa8482019-01-29 22:14:24 +01001225 with contextlib.ExitStack() as stack:
1226 if _mswindows:
1227 if p2cread != -1:
1228 stack.callback(p2cread.Close)
1229 if c2pwrite != -1:
1230 stack.callback(c2pwrite.Close)
1231 if errwrite != -1:
1232 stack.callback(errwrite.Close)
1233 else:
1234 if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
1235 stack.callback(os.close, p2cread)
1236 if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
1237 stack.callback(os.close, c2pwrite)
1238 if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
1239 stack.callback(os.close, errwrite)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001240
Giampaolo Rodolabafa8482019-01-29 22:14:24 +01001241 if devnull_fd is not None:
1242 stack.callback(os.close, devnull_fd)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001243
1244 # Prevent a double close of these handles/fds from __init__ on error.
1245 self._closed_child_pipe_fds = True
1246
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -07001247 if _mswindows:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001248 #
1249 # Windows methods
1250 #
1251 def _get_handles(self, stdin, stdout, stderr):
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +00001252 """Construct and return tuple with IO objects:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001253 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1254 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001255 if stdin is None and stdout is None and stderr is None:
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001256 return (-1, -1, -1, -1, -1, -1)
Tim Peterse718f612004-10-12 21:51:32 +00001257
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001258 p2cread, p2cwrite = -1, -1
1259 c2pread, c2pwrite = -1, -1
1260 errread, errwrite = -1, -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001261
Peter Astrandd38ddf42005-02-10 08:32:50 +00001262 if stdin is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001263 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001264 if p2cread is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001265 p2cread, _ = _winapi.CreatePipe(None, 0)
1266 p2cread = Handle(p2cread)
1267 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001268 elif stdin == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001269 p2cread, p2cwrite = _winapi.CreatePipe(None, 0)
1270 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001271 elif stdin == DEVNULL:
1272 p2cread = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001273 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001274 p2cread = msvcrt.get_osfhandle(stdin)
1275 else:
1276 # Assuming file-like object
1277 p2cread = msvcrt.get_osfhandle(stdin.fileno())
1278 p2cread = self._make_inheritable(p2cread)
1279
Peter Astrandd38ddf42005-02-10 08:32:50 +00001280 if stdout is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001281 c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001282 if c2pwrite is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001283 _, c2pwrite = _winapi.CreatePipe(None, 0)
1284 c2pwrite = Handle(c2pwrite)
1285 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001286 elif stdout == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001287 c2pread, c2pwrite = _winapi.CreatePipe(None, 0)
1288 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001289 elif stdout == DEVNULL:
1290 c2pwrite = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001291 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001292 c2pwrite = msvcrt.get_osfhandle(stdout)
1293 else:
1294 # Assuming file-like object
1295 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
1296 c2pwrite = self._make_inheritable(c2pwrite)
1297
Peter Astrandd38ddf42005-02-10 08:32:50 +00001298 if stderr is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001299 errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001300 if errwrite is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001301 _, errwrite = _winapi.CreatePipe(None, 0)
1302 errwrite = Handle(errwrite)
1303 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001304 elif stderr == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001305 errread, errwrite = _winapi.CreatePipe(None, 0)
1306 errread, errwrite = Handle(errread), Handle(errwrite)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001307 elif stderr == STDOUT:
1308 errwrite = c2pwrite
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001309 elif stderr == DEVNULL:
1310 errwrite = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001311 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001312 errwrite = msvcrt.get_osfhandle(stderr)
1313 else:
1314 # Assuming file-like object
1315 errwrite = msvcrt.get_osfhandle(stderr.fileno())
1316 errwrite = self._make_inheritable(errwrite)
1317
1318 return (p2cread, p2cwrite,
1319 c2pread, c2pwrite,
1320 errread, errwrite)
1321
1322
1323 def _make_inheritable(self, handle):
1324 """Return a duplicate of handle, which is inheritable"""
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001325 h = _winapi.DuplicateHandle(
1326 _winapi.GetCurrentProcess(), handle,
1327 _winapi.GetCurrentProcess(), 0, 1,
1328 _winapi.DUPLICATE_SAME_ACCESS)
1329 return Handle(h)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001330
1331
Segev Finerb2a60832017-12-18 11:28:19 +02001332 def _filter_handle_list(self, handle_list):
1333 """Filter out console handles that can't be used
1334 in lpAttributeList["handle_list"] and make sure the list
1335 isn't empty. This also removes duplicate handles."""
1336 # An handle with it's lowest two bits set might be a special console
1337 # handle that if passed in lpAttributeList["handle_list"], will
1338 # cause it to fail.
1339 return list({handle for handle in handle_list
1340 if handle & 0x3 != 0x3
1341 or _winapi.GetFileType(handle) !=
1342 _winapi.FILE_TYPE_CHAR})
1343
1344
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001345 def _execute_child(self, args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +03001346 pass_fds, cwd, env,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001347 startupinfo, creationflags, shell,
1348 p2cread, p2cwrite,
1349 c2pread, c2pwrite,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001350 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001351 unused_restore_signals,
1352 unused_gid, unused_gids, unused_uid,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001353 unused_umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001354 unused_start_new_session):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001355 """Execute program (MS Windows version)"""
1356
Gregory P. Smith8edd99d2010-12-14 13:43:30 +00001357 assert not pass_fds, "pass_fds not supported on Windows."
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +00001358
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001359 if isinstance(args, str):
1360 pass
1361 elif isinstance(args, bytes):
1362 if shell:
1363 raise TypeError('bytes args is not allowed on Windows')
1364 args = list2cmdline([args])
1365 elif isinstance(args, os.PathLike):
1366 if shell:
1367 raise TypeError('path-like args is not allowed when '
1368 'shell is true')
1369 args = list2cmdline([args])
1370 else:
Serhiy Storchakabe50a7b2018-02-28 01:03:46 +02001371 args = list2cmdline(args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001372
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001373 if executable is not None:
1374 executable = os.fsdecode(executable)
1375
Peter Astrandc1d65362004-11-07 14:30:34 +00001376 # Process startup details
Peter Astrandd38ddf42005-02-10 08:32:50 +00001377 if startupinfo is None:
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001378 startupinfo = STARTUPINFO()
Victor Stinner483422f2018-07-05 22:54:17 +02001379 else:
1380 # bpo-34044: Copy STARTUPINFO since it is modified above,
1381 # so the caller can reuse it multiple times.
1382 startupinfo = startupinfo.copy()
Segev Finerb2a60832017-12-18 11:28:19 +02001383
1384 use_std_handles = -1 not in (p2cread, c2pwrite, errwrite)
1385 if use_std_handles:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001386 startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES
Peter Astrandc1d65362004-11-07 14:30:34 +00001387 startupinfo.hStdInput = p2cread
1388 startupinfo.hStdOutput = c2pwrite
1389 startupinfo.hStdError = errwrite
1390
Segev Finerb2a60832017-12-18 11:28:19 +02001391 attribute_list = startupinfo.lpAttributeList
1392 have_handle_list = bool(attribute_list and
1393 "handle_list" in attribute_list and
1394 attribute_list["handle_list"])
1395
1396 # If we were given an handle_list or need to create one
1397 if have_handle_list or (use_std_handles and close_fds):
1398 if attribute_list is None:
1399 attribute_list = startupinfo.lpAttributeList = {}
1400 handle_list = attribute_list["handle_list"] = \
1401 list(attribute_list.get("handle_list", []))
1402
1403 if use_std_handles:
1404 handle_list += [int(p2cread), int(c2pwrite), int(errwrite)]
1405
1406 handle_list[:] = self._filter_handle_list(handle_list)
1407
1408 if handle_list:
1409 if not close_fds:
1410 warnings.warn("startupinfo.lpAttributeList['handle_list'] "
1411 "overriding close_fds", RuntimeWarning)
1412
1413 # When using the handle_list we always request to inherit
1414 # handles but the only handles that will be inherited are
1415 # the ones in the handle_list
1416 close_fds = False
1417
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001418 if shell:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001419 startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW
1420 startupinfo.wShowWindow = _winapi.SW_HIDE
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001421 comspec = os.environ.get("COMSPEC", "cmd.exe")
Tim Golden126c2962010-08-11 14:20:40 +00001422 args = '{} /c "{}"'.format (comspec, args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001423
Steve Dower60419a72019-06-24 08:42:54 -07001424 if cwd is not None:
1425 cwd = os.fsdecode(cwd)
1426
1427 sys.audit("subprocess.Popen", executable, args, cwd, env)
1428
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001429 # Start the process
1430 try:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001431 hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
Tim Peterse8374a52004-10-13 03:15:00 +00001432 # no special security
1433 None, None,
Guido van Rossume7ba4952007-06-06 23:52:48 +00001434 int(not close_fds),
Tim Peterse8374a52004-10-13 03:15:00 +00001435 creationflags,
1436 env,
Steve Dower60419a72019-06-24 08:42:54 -07001437 cwd,
Tim Peterse8374a52004-10-13 03:15:00 +00001438 startupinfo)
Tim Goldenad537f22010-08-08 11:18:16 +00001439 finally:
1440 # Child is launched. Close the parent's copy of those pipe
1441 # handles that only the child should have open. You need
1442 # to make sure that no handles to the write end of the
1443 # output pipe are maintained in this process or else the
1444 # pipe will not close when the child process exits and the
1445 # ReadFile will hang.
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001446 self._close_pipe_fds(p2cread, p2cwrite,
1447 c2pread, c2pwrite,
1448 errread, errwrite)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001449
1450 # Retain the process handle, but close the thread handle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001451 self._child_created = True
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001452 self._handle = Handle(hp)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001453 self.pid = pid
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001454 _winapi.CloseHandle(ht)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001455
Brett Cannon84df1e62010-05-14 00:33:40 +00001456 def _internal_poll(self, _deadstate=None,
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001457 _WaitForSingleObject=_winapi.WaitForSingleObject,
1458 _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0,
1459 _GetExitCodeProcess=_winapi.GetExitCodeProcess):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001460 """Check if child process has terminated. Returns returncode
Brett Cannon84df1e62010-05-14 00:33:40 +00001461 attribute.
1462
1463 This method is called by __del__, so it can only refer to objects
1464 in its local scope.
1465
1466 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001467 if self.returncode is None:
Brett Cannon84df1e62010-05-14 00:33:40 +00001468 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
1469 self.returncode = _GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001470 return self.returncode
1471
1472
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001473 def _wait(self, timeout):
1474 """Internal implementation of wait() on Windows."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001475 if timeout is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001476 timeout_millis = _winapi.INFINITE
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001477 else:
Reid Kleckner91156ff2011-03-21 10:06:10 -07001478 timeout_millis = int(timeout * 1000)
Peter Astrandd38ddf42005-02-10 08:32:50 +00001479 if self.returncode is None:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001480 # API note: Returns immediately if timeout_millis == 0.
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001481 result = _winapi.WaitForSingleObject(self._handle,
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001482 timeout_millis)
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001483 if result == _winapi.WAIT_TIMEOUT:
Reid Kleckner2b228f02011-03-16 16:57:54 -04001484 raise TimeoutExpired(self.args, timeout)
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001485 self.returncode = _winapi.GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001486 return self.returncode
1487
1488
1489 def _readerthread(self, fh, buffer):
1490 buffer.append(fh.read())
Victor Stinner667d4b52010-12-25 22:40:32 +00001491 fh.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001492
1493
Reid Kleckner2b228f02011-03-16 16:57:54 -04001494 def _communicate(self, input, endtime, orig_timeout):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001495 # Start reader threads feeding into a list hanging off of this
1496 # object, unless they've already been started.
1497 if self.stdout and not hasattr(self, "_stdout_buff"):
1498 self._stdout_buff = []
1499 self.stdout_thread = \
1500 threading.Thread(target=self._readerthread,
1501 args=(self.stdout, self._stdout_buff))
1502 self.stdout_thread.daemon = True
1503 self.stdout_thread.start()
1504 if self.stderr and not hasattr(self, "_stderr_buff"):
1505 self._stderr_buff = []
1506 self.stderr_thread = \
1507 threading.Thread(target=self._readerthread,
1508 args=(self.stderr, self._stderr_buff))
1509 self.stderr_thread.daemon = True
1510 self.stderr_thread.start()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001511
1512 if self.stdin:
Victor Stinnera5e881d2015-01-14 17:07:59 +01001513 self._stdin_write(input)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001514
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001515 # Wait for the reader threads, or time out. If we time out, the
1516 # threads remain reading and the fds left open in case the user
1517 # calls communicate again.
1518 if self.stdout is not None:
1519 self.stdout_thread.join(self._remaining_time(endtime))
Andrew Svetlov377a1522012-08-19 20:49:39 +03001520 if self.stdout_thread.is_alive():
Reid Kleckner9a67e6c2011-03-20 08:28:07 -07001521 raise TimeoutExpired(self.args, orig_timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001522 if self.stderr is not None:
1523 self.stderr_thread.join(self._remaining_time(endtime))
Andrew Svetlov377a1522012-08-19 20:49:39 +03001524 if self.stderr_thread.is_alive():
Reid Kleckner9a67e6c2011-03-20 08:28:07 -07001525 raise TimeoutExpired(self.args, orig_timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001526
1527 # Collect the output from and close both pipes, now that we know
1528 # both have been read successfully.
1529 stdout = None
1530 stderr = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001531 if self.stdout:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001532 stdout = self._stdout_buff
1533 self.stdout.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001534 if self.stderr:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001535 stderr = self._stderr_buff
1536 self.stderr.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001537
1538 # All data exchanged. Translate lists into strings.
Peter Astrandd38ddf42005-02-10 08:32:50 +00001539 if stdout is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001540 stdout = stdout[0]
Peter Astrandd38ddf42005-02-10 08:32:50 +00001541 if stderr is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001542 stderr = stderr[0]
1543
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001544 return (stdout, stderr)
1545
Christian Heimesa342c012008-04-20 21:01:16 +00001546 def send_signal(self, sig):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08001547 """Send a signal to the process."""
1548 # Don't signal a process that we know has already died.
1549 if self.returncode is not None:
1550 return
Christian Heimesa342c012008-04-20 21:01:16 +00001551 if sig == signal.SIGTERM:
1552 self.terminate()
Brian Curtineb24d742010-04-12 17:16:38 +00001553 elif sig == signal.CTRL_C_EVENT:
1554 os.kill(self.pid, signal.CTRL_C_EVENT)
1555 elif sig == signal.CTRL_BREAK_EVENT:
1556 os.kill(self.pid, signal.CTRL_BREAK_EVENT)
Christian Heimesa342c012008-04-20 21:01:16 +00001557 else:
Brian Curtin19651362010-09-07 13:24:38 +00001558 raise ValueError("Unsupported signal: {}".format(sig))
Christian Heimesa342c012008-04-20 21:01:16 +00001559
1560 def terminate(self):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08001561 """Terminates the process."""
1562 # Don't terminate a process that we know has already died.
1563 if self.returncode is not None:
1564 return
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001565 try:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001566 _winapi.TerminateProcess(self._handle, 1)
Antoine Pitroub69ef162012-03-11 19:33:29 +01001567 except PermissionError:
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001568 # ERROR_ACCESS_DENIED (winerror 5) is received when the
1569 # process already died.
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001570 rc = _winapi.GetExitCodeProcess(self._handle)
1571 if rc == _winapi.STILL_ACTIVE:
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001572 raise
1573 self.returncode = rc
Christian Heimesa342c012008-04-20 21:01:16 +00001574
1575 kill = terminate
1576
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001577 else:
1578 #
1579 # POSIX methods
1580 #
1581 def _get_handles(self, stdin, stdout, stderr):
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +00001582 """Construct and return tuple with IO objects:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001583 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1584 """
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001585 p2cread, p2cwrite = -1, -1
1586 c2pread, c2pwrite = -1, -1
1587 errread, errwrite = -1, -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001588
Peter Astrandd38ddf42005-02-10 08:32:50 +00001589 if stdin is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001590 pass
1591 elif stdin == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001592 p2cread, p2cwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001593 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1594 fcntl.fcntl(p2cwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001595 elif stdin == DEVNULL:
1596 p2cread = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001597 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001598 p2cread = stdin
1599 else:
1600 # Assuming file-like object
1601 p2cread = stdin.fileno()
1602
Peter Astrandd38ddf42005-02-10 08:32:50 +00001603 if stdout is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001604 pass
1605 elif stdout == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001606 c2pread, c2pwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001607 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1608 fcntl.fcntl(c2pwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001609 elif stdout == DEVNULL:
1610 c2pwrite = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001611 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001612 c2pwrite = stdout
1613 else:
1614 # Assuming file-like object
Tim Peterse718f612004-10-12 21:51:32 +00001615 c2pwrite = stdout.fileno()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001616
Peter Astrandd38ddf42005-02-10 08:32:50 +00001617 if stderr is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001618 pass
1619 elif stderr == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001620 errread, errwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001621 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1622 fcntl.fcntl(errwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001623 elif stderr == STDOUT:
Martin Panterc7635892016-05-13 01:54:44 +00001624 if c2pwrite != -1:
1625 errwrite = c2pwrite
1626 else: # child's stdout is not set, use parent's stdout
1627 errwrite = sys.__stdout__.fileno()
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001628 elif stderr == DEVNULL:
1629 errwrite = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001630 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001631 errwrite = stderr
1632 else:
1633 # Assuming file-like object
1634 errwrite = stderr.fileno()
1635
1636 return (p2cread, p2cwrite,
1637 c2pread, c2pwrite,
1638 errread, errwrite)
1639
1640
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001641 def _posix_spawn(self, args, executable, env, restore_signals,
1642 p2cread, p2cwrite,
1643 c2pread, c2pwrite,
1644 errread, errwrite):
Victor Stinner8c349562019-01-16 23:38:06 +01001645 """Execute program using os.posix_spawn()."""
Victor Stinner9daecf32019-01-16 00:02:35 +01001646 if env is None:
1647 env = os.environ
1648
1649 kwargs = {}
1650 if restore_signals:
1651 # See _Py_RestoreSignals() in Python/pylifecycle.c
1652 sigset = []
1653 for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'):
1654 signum = getattr(signal, signame, None)
1655 if signum is not None:
1656 sigset.append(signum)
1657 kwargs['setsigdef'] = sigset
1658
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001659 file_actions = []
1660 for fd in (p2cwrite, c2pread, errread):
1661 if fd != -1:
1662 file_actions.append((os.POSIX_SPAWN_CLOSE, fd))
1663 for fd, fd2 in (
1664 (p2cread, 0),
1665 (c2pwrite, 1),
1666 (errwrite, 2),
1667 ):
1668 if fd != -1:
1669 file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2))
1670 if file_actions:
1671 kwargs['file_actions'] = file_actions
1672
Victor Stinner8c349562019-01-16 23:38:06 +01001673 self.pid = os.posix_spawn(executable, args, env, **kwargs)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001674 self._child_created = True
1675
1676 self._close_pipe_fds(p2cread, p2cwrite,
1677 c2pread, c2pwrite,
1678 errread, errwrite)
Victor Stinner9daecf32019-01-16 00:02:35 +01001679
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001680 def _execute_child(self, args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +03001681 pass_fds, cwd, env,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001682 startupinfo, creationflags, shell,
1683 p2cread, p2cwrite,
1684 c2pread, c2pwrite,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001685 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001686 restore_signals,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001687 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001688 start_new_session):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001689 """Execute program (POSIX version)"""
1690
Victor Stinner7b3b20a2011-03-03 12:54:05 +00001691 if isinstance(args, (str, bytes)):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001692 args = [args]
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001693 elif isinstance(args, os.PathLike):
1694 if shell:
1695 raise TypeError('path-like args is not allowed when '
1696 'shell is true')
1697 args = [args]
Thomas Wouters89f507f2006-12-13 04:49:30 +00001698 else:
Serhiy Storchakabe50a7b2018-02-28 01:03:46 +02001699 args = list(args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001700
1701 if shell:
Xavier de Gayeb35fc622016-12-13 16:32:21 +01001702 # On Android the default shell is at '/system/bin/sh'.
1703 unix_shell = ('/system/bin/sh' if
1704 hasattr(sys, 'getandroidapilevel') else '/bin/sh')
1705 args = [unix_shell, "-c"] + args
Stefan Krah9542cc62010-07-19 14:20:53 +00001706 if executable:
1707 args[0] = executable
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001708
Peter Astrandd38ddf42005-02-10 08:32:50 +00001709 if executable is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001710 executable = args[0]
Victor Stinner9daecf32019-01-16 00:02:35 +01001711
Steve Dower60419a72019-06-24 08:42:54 -07001712 sys.audit("subprocess.Popen", executable, args, cwd, env)
1713
Victor Stinner9daecf32019-01-16 00:02:35 +01001714 if (_USE_POSIX_SPAWN
Victor Stinner8c349562019-01-16 23:38:06 +01001715 and os.path.dirname(executable)
Victor Stinner9daecf32019-01-16 00:02:35 +01001716 and preexec_fn is None
1717 and not close_fds
1718 and not pass_fds
1719 and cwd is None
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001720 and (p2cread == -1 or p2cread > 2)
1721 and (c2pwrite == -1 or c2pwrite > 2)
1722 and (errwrite == -1 or errwrite > 2)
Victor Stinnerfaca8552019-09-25 15:52:49 +02001723 and not start_new_session
1724 and gid is None
1725 and gids is None
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001726 and uid is None
1727 and umask < 0):
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001728 self._posix_spawn(args, executable, env, restore_signals,
1729 p2cread, p2cwrite,
1730 c2pread, c2pwrite,
1731 errread, errwrite)
Victor Stinner9daecf32019-01-16 00:02:35 +01001732 return
1733
Gregory P. Smith5591b022012-10-10 03:34:47 -07001734 orig_executable = executable
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001735
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001736 # For transferring possible exec failure from child to parent.
1737 # Data format: "exception name:hex errno:description"
1738 # Pickle is not used; it is complex and involves memory allocation.
Victor Stinnerdaf45552013-08-28 00:53:59 +02001739 errpipe_read, errpipe_write = os.pipe()
Gregory P. Smith53dd8162013-12-01 16:03:24 -08001740 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
1741 low_fds_to_close = []
1742 while errpipe_write < 3:
1743 low_fds_to_close.append(errpipe_write)
1744 errpipe_write = os.dup(errpipe_write)
1745 for low_fd in low_fds_to_close:
1746 os.close(low_fd)
Christian Heimesfdab48e2008-01-20 09:06:41 +00001747 try:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001748 try:
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001749 # We must avoid complex work that could involve
1750 # malloc or free in the child process to avoid
1751 # potential deadlocks, thus we do all this here.
1752 # and pass it to fork_exec()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001753
Victor Stinner372b8382011-06-21 17:24:21 +02001754 if env is not None:
Serhiy Storchakad174d242017-06-23 19:39:27 +03001755 env_list = []
1756 for k, v in env.items():
1757 k = os.fsencode(k)
1758 if b'=' in k:
1759 raise ValueError("illegal environment variable name")
1760 env_list.append(k + b'=' + os.fsencode(v))
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001761 else:
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001762 env_list = None # Use execv instead of execve.
1763 executable = os.fsencode(executable)
1764 if os.path.dirname(executable):
1765 executable_list = (executable,)
1766 else:
1767 # This matches the behavior of os._execvpe().
1768 executable_list = tuple(
1769 os.path.join(os.fsencode(dir), executable)
1770 for dir in os.get_exec_path(env))
Gregory P. Smith361e30c2013-12-01 00:12:24 -08001771 fds_to_keep = set(pass_fds)
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001772 fds_to_keep.add(errpipe_write)
1773 self.pid = _posixsubprocess.fork_exec(
1774 args, executable_list,
Serhiy Storchaka66bffd12017-04-19 21:12:46 +03001775 close_fds, tuple(sorted(map(int, fds_to_keep))),
1776 cwd, env_list,
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001777 p2cread, p2cwrite, c2pread, c2pwrite,
1778 errread, errwrite,
1779 errpipe_read, errpipe_write,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001780 restore_signals, start_new_session,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001781 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001782 preexec_fn)
Charles-François Natali558639f2011-08-18 19:11:29 +02001783 self._child_created = True
Facundo Batista10706e22009-06-19 20:34:30 +00001784 finally:
1785 # be sure the FD is closed no matter what
1786 os.close(errpipe_write)
1787
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001788 self._close_pipe_fds(p2cread, p2cwrite,
1789 c2pread, c2pwrite,
1790 errread, errwrite)
Facundo Batista10706e22009-06-19 20:34:30 +00001791
1792 # Wait for exec to fail or succeed; possibly raising an
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001793 # exception (limited in size)
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001794 errpipe_data = bytearray()
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001795 while True:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001796 part = os.read(errpipe_read, 50000)
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001797 errpipe_data += part
1798 if not part or len(errpipe_data) > 50000:
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001799 break
Facundo Batista10706e22009-06-19 20:34:30 +00001800 finally:
1801 # be sure the FD is closed no matter what
1802 os.close(errpipe_read)
1803
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001804 if errpipe_data:
Gregory P. Smithe85db2b2010-12-14 14:38:00 +00001805 try:
Victor Stinnera58e2c52016-05-20 12:08:12 +02001806 pid, sts = os.waitpid(self.pid, 0)
1807 if pid == self.pid:
1808 self._handle_exitstatus(sts)
1809 else:
1810 self.returncode = sys.maxsize
Victor Stinnera5e881d2015-01-14 17:07:59 +01001811 except ChildProcessError:
1812 pass
Victor Stinnera58e2c52016-05-20 12:08:12 +02001813
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001814 try:
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001815 exception_name, hex_errno, err_msg = (
1816 errpipe_data.split(b':', 2))
Ammar Askar3fc499b2017-09-06 02:41:30 -04001817 # The encoding here should match the encoding
1818 # written in by the subprocess implementations
1819 # like _posixsubprocess
1820 err_msg = err_msg.decode()
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001821 except ValueError:
Gregory P. Smith8d07c262012-11-10 23:53:47 -08001822 exception_name = b'SubprocessError'
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001823 hex_errno = b'0'
Ammar Askar3fc499b2017-09-06 02:41:30 -04001824 err_msg = 'Bad exception data from child: {!r}'.format(
1825 bytes(errpipe_data))
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001826 child_exception_type = getattr(
1827 builtins, exception_name.decode('ascii'),
Gregory P. Smith8d07c262012-11-10 23:53:47 -08001828 SubprocessError)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001829 if issubclass(child_exception_type, OSError) and hex_errno:
Benjamin Petersonb8bc4392010-11-20 18:24:54 +00001830 errno_num = int(hex_errno, 16)
Gregory P. Smith5591b022012-10-10 03:34:47 -07001831 child_exec_never_called = (err_msg == "noexec")
1832 if child_exec_never_called:
1833 err_msg = ""
Gregory P. Smith8621bb52017-08-24 14:58:25 -07001834 # The error must be from chdir(cwd).
1835 err_filename = cwd
1836 else:
1837 err_filename = orig_executable
Benjamin Petersonb8bc4392010-11-20 18:24:54 +00001838 if errno_num != 0:
1839 err_msg = os.strerror(errno_num)
Gregory P. Smith8621bb52017-08-24 14:58:25 -07001840 raise child_exception_type(errno_num, err_msg, err_filename)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001841 raise child_exception_type(err_msg)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001842
1843
Victor Stinner65a796e2020-04-01 18:49:29 +02001844 def _handle_exitstatus(self, sts,
1845 waitstatus_to_exitcode=os.waitstatus_to_exitcode,
1846 _WIFSTOPPED=os.WIFSTOPPED,
1847 _WSTOPSIG=os.WSTOPSIG):
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001848 """All callers to this function MUST hold self._waitpid_lock."""
Brett Cannon84df1e62010-05-14 00:33:40 +00001849 # This method is called (indirectly) by __del__, so it cannot
Serhiy Storchaka72e77612014-02-10 19:20:22 +02001850 # refer to anything outside of its local scope.
Victor Stinner65a796e2020-04-01 18:49:29 +02001851 if _WIFSTOPPED(sts):
Gregory P. Smith50e16e32017-01-22 17:28:38 -08001852 self.returncode = -_WSTOPSIG(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001853 else:
Victor Stinner65a796e2020-04-01 18:49:29 +02001854 self.returncode = waitstatus_to_exitcode(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001855
Brett Cannon84df1e62010-05-14 00:33:40 +00001856 def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid,
Andrew Svetlov1d960fe2012-12-24 20:08:53 +02001857 _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001858 """Check if child process has terminated. Returns returncode
Brett Cannon84df1e62010-05-14 00:33:40 +00001859 attribute.
1860
1861 This method is called by __del__, so it cannot reference anything
1862 outside of the local scope (nor can any methods it calls).
1863
1864 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001865 if self.returncode is None:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001866 if not self._waitpid_lock.acquire(False):
1867 # Something else is busy calling waitpid. Don't allow two
1868 # at once. We know nothing yet.
1869 return None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001870 try:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001871 if self.returncode is not None:
1872 return self.returncode # Another thread waited.
Brett Cannon84df1e62010-05-14 00:33:40 +00001873 pid, sts = _waitpid(self.pid, _WNOHANG)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001874 if pid == self.pid:
1875 self._handle_exitstatus(sts)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +02001876 except OSError as e:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001877 if _deadstate is not None:
1878 self.returncode = _deadstate
Andrew Svetlov08bab072012-12-24 20:06:35 +02001879 elif e.errno == _ECHILD:
Gregory P. Smith39051712012-09-29 11:40:38 -07001880 # This happens if SIGCLD is set to be ignored or
1881 # waiting for child processes has otherwise been
1882 # disabled for our process. This child is dead, we
1883 # can't get the status.
1884 # http://bugs.python.org/issue15756
1885 self.returncode = 0
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001886 finally:
1887 self._waitpid_lock.release()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001888 return self.returncode
1889
1890
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001891 def _try_wait(self, wait_flags):
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001892 """All callers to this function MUST hold self._waitpid_lock."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001893 try:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001894 (pid, sts) = os.waitpid(self.pid, wait_flags)
Victor Stinnera5e881d2015-01-14 17:07:59 +01001895 except ChildProcessError:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001896 # This happens if SIGCLD is set to be ignored or waiting
1897 # for child processes has otherwise been disabled for our
1898 # process. This child is dead, we can't get the status.
1899 pid = self.pid
1900 sts = 0
1901 return (pid, sts)
1902
1903
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001904 def _wait(self, timeout):
1905 """Internal implementation of wait() on POSIX."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001906 if self.returncode is not None:
1907 return self.returncode
Reid Kleckner2b228f02011-03-16 16:57:54 -04001908
Gregory P. Smith82604e02016-11-20 16:31:07 -08001909 if timeout is not None:
1910 endtime = _time() + timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001911 # Enter a busy loop if we have a timeout. This busy loop was
1912 # cribbed from Lib/threading.py in Thread.wait() at r71065.
1913 delay = 0.0005 # 500 us -> initial delay of 1 ms
1914 while True:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001915 if self._waitpid_lock.acquire(False):
1916 try:
1917 if self.returncode is not None:
1918 break # Another thread waited.
1919 (pid, sts) = self._try_wait(os.WNOHANG)
1920 assert pid == self.pid or pid == 0
1921 if pid == self.pid:
1922 self._handle_exitstatus(sts)
1923 break
1924 finally:
1925 self._waitpid_lock.release()
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001926 remaining = self._remaining_time(endtime)
1927 if remaining <= 0:
Reid Kleckner2b228f02011-03-16 16:57:54 -04001928 raise TimeoutExpired(self.args, timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001929 delay = min(delay * 2, remaining, .05)
1930 time.sleep(delay)
Gregory P. Smithf328d792012-11-10 21:06:18 -08001931 else:
1932 while self.returncode is None:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001933 with self._waitpid_lock:
1934 if self.returncode is not None:
1935 break # Another thread waited.
1936 (pid, sts) = self._try_wait(0)
1937 # Check the pid and loop as waitpid has been known to
1938 # return 0 even without WNOHANG in odd situations.
1939 # http://bugs.python.org/issue14396.
1940 if pid == self.pid:
1941 self._handle_exitstatus(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001942 return self.returncode
1943
1944
Reid Kleckner2b228f02011-03-16 16:57:54 -04001945 def _communicate(self, input, endtime, orig_timeout):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001946 if self.stdin and not self._communication_started:
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001947 # Flush stdio buffer. This might block, if the user has
1948 # been writing to .stdin in an uncontrolled fashion.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001949 try:
1950 self.stdin.flush()
1951 except BrokenPipeError:
1952 pass # communicate() must ignore BrokenPipeError.
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001953 if not input:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001954 try:
1955 self.stdin.close()
1956 except BrokenPipeError:
1957 pass # communicate() must ignore BrokenPipeError.
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001958
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001959 stdout = None
1960 stderr = None
1961
1962 # Only create this mapping if we haven't already.
1963 if not self._communication_started:
1964 self._fileobj2output = {}
1965 if self.stdout:
1966 self._fileobj2output[self.stdout] = []
1967 if self.stderr:
1968 self._fileobj2output[self.stderr] = []
1969
1970 if self.stdout:
1971 stdout = self._fileobj2output[self.stdout]
1972 if self.stderr:
1973 stderr = self._fileobj2output[self.stderr]
1974
1975 self._save_input(input)
1976
Gregory P. Smith5ca129b2013-12-07 19:14:59 -08001977 if self._input:
1978 input_view = memoryview(self._input)
1979
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001980 with _PopenSelector() as selector:
1981 if self.stdin and input:
1982 selector.register(self.stdin, selectors.EVENT_WRITE)
Alex Rebertd3ae95e2020-01-22 18:28:31 -05001983 if self.stdout and not self.stdout.closed:
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001984 selector.register(self.stdout, selectors.EVENT_READ)
Alex Rebertd3ae95e2020-01-22 18:28:31 -05001985 if self.stderr and not self.stderr.closed:
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001986 selector.register(self.stderr, selectors.EVENT_READ)
1987
1988 while selector.get_map():
1989 timeout = self._remaining_time(endtime)
1990 if timeout is not None and timeout < 0:
Gregory P. Smith580d2782019-09-11 04:23:05 -05001991 self._check_timeout(endtime, orig_timeout,
1992 stdout, stderr,
1993 skip_check_and_raise=True)
1994 raise RuntimeError( # Impossible :)
1995 '_check_timeout(..., skip_check_and_raise=True) '
1996 'failed to raise TimeoutExpired.')
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001997
1998 ready = selector.select(timeout)
Gregory P. Smith580d2782019-09-11 04:23:05 -05001999 self._check_timeout(endtime, orig_timeout, stdout, stderr)
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002000
2001 # XXX Rewrite these to use non-blocking I/O on the file
2002 # objects; they are no longer using C stdio!
2003
2004 for key, events in ready:
2005 if key.fileobj is self.stdin:
Gregory P. Smith5ca129b2013-12-07 19:14:59 -08002006 chunk = input_view[self._input_offset :
2007 self._input_offset + _PIPE_BUF]
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002008 try:
2009 self._input_offset += os.write(key.fd, chunk)
Victor Stinnera5e881d2015-01-14 17:07:59 +01002010 except BrokenPipeError:
2011 selector.unregister(key.fileobj)
2012 key.fileobj.close()
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002013 else:
2014 if self._input_offset >= len(self._input):
2015 selector.unregister(key.fileobj)
2016 key.fileobj.close()
2017 elif key.fileobj in (self.stdout, self.stderr):
Gregory P. Smith7b83b182013-12-08 10:58:28 -08002018 data = os.read(key.fd, 32768)
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002019 if not data:
2020 selector.unregister(key.fileobj)
2021 key.fileobj.close()
2022 self._fileobj2output[key.fileobj].append(data)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04002023
2024 self.wait(timeout=self._remaining_time(endtime))
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002025
2026 # All data exchanged. Translate lists into strings.
2027 if stdout is not None:
2028 stdout = b''.join(stdout)
2029 if stderr is not None:
2030 stderr = b''.join(stderr)
2031
2032 # Translate newlines, if requested.
2033 # This also turns bytes into strings.
andyclegg7fed7bd2017-10-23 03:01:19 +01002034 if self.text_mode:
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002035 if stdout is not None:
2036 stdout = self._translate_newlines(stdout,
Steve Dower050acae2016-09-06 20:16:17 -07002037 self.stdout.encoding,
2038 self.stdout.errors)
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002039 if stderr is not None:
2040 stderr = self._translate_newlines(stderr,
Steve Dower050acae2016-09-06 20:16:17 -07002041 self.stderr.encoding,
2042 self.stderr.errors)
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002043
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002044 return (stdout, stderr)
2045
2046
Andrew Svetlovaa0dbdc2012-08-14 18:40:21 +03002047 def _save_input(self, input):
2048 # This method is called from the _communicate_with_*() methods
2049 # so that if we time out while communicating, we can continue
2050 # sending input if we retry.
2051 if self.stdin and self._input is None:
2052 self._input_offset = 0
2053 self._input = input
andyclegg7fed7bd2017-10-23 03:01:19 +01002054 if input is not None and self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -07002055 self._input = self._input.encode(self.stdin.encoding,
2056 self.stdin.errors)
Andrew Svetlovaa0dbdc2012-08-14 18:40:21 +03002057
2058
Christian Heimesa342c012008-04-20 21:01:16 +00002059 def send_signal(self, sig):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08002060 """Send a signal to the process."""
Victor Stinnere85a3052020-01-15 17:38:55 +01002061 # bpo-38630: Polling reduces the risk of sending a signal to the
2062 # wrong process if the process completed, the Popen.returncode
2063 # attribute is still None, and the pid has been reassigned
2064 # (recycled) to a new different process. This race condition can
2065 # happens in two cases.
2066 #
2067 # Case 1. Thread A calls Popen.poll(), thread B calls
2068 # Popen.send_signal(). In thread A, waitpid() succeed and returns
2069 # the exit status. Thread B calls kill() because poll() in thread A
2070 # did not set returncode yet. Calling poll() in thread B prevents
2071 # the race condition thanks to Popen._waitpid_lock.
2072 #
2073 # Case 2. waitpid(pid, 0) has been called directly, without
2074 # using Popen methods: returncode is still None is this case.
2075 # Calling Popen.poll() will set returncode to a default value,
2076 # since waitpid() fails with ProcessLookupError.
2077 self.poll()
2078 if self.returncode is not None:
2079 # Skip signalling a process that we know has already died.
2080 return
2081
2082 # The race condition can still happen if the race condition
2083 # described above happens between the returncode test
2084 # and the kill() call.
Filipe Laíns01a202a2020-11-21 09:22:08 +00002085 try:
2086 os.kill(self.pid, sig)
2087 except ProcessLookupError:
2088 # Supress the race condition error; bpo-40550.
2089 pass
Christian Heimesa342c012008-04-20 21:01:16 +00002090
2091 def terminate(self):
2092 """Terminate the process with SIGTERM
2093 """
2094 self.send_signal(signal.SIGTERM)
2095
2096 def kill(self):
2097 """Kill the process with SIGKILL
2098 """
2099 self.send_signal(signal.SIGKILL)