blob: ccb46a6337b3d968b4a5041a214bd39e77f941b4 [file] [log] [blame]
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001# subprocess - Subprocesses with accessible I/O streams
2#
Tim Peterse718f612004-10-12 21:51:32 +00003# For more information about this module, see PEP 324.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00004#
Peter Astrand3a708df2005-09-23 17:37:29 +00005# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se>
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00006#
Peter Astrand69bf13f2005-02-14 08:56:32 +00007# Licensed to PSF under a Contributor Agreement.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00008
Martin Panter4afdca02016-10-25 22:20:48 +00009r"""Subprocesses with accessible I/O streams
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000010
Fredrik Lundh15aaacc2004-10-17 14:47:05 +000011This module allows you to spawn processes, connect to their
Martin Panter4afdca02016-10-25 22:20:48 +000012input/output/error pipes, and obtain their return codes.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000013
Martin Panter4afdca02016-10-25 22:20:48 +000014For a complete description of this module see the Python documentation.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000015
Martin Panter4afdca02016-10-25 22:20:48 +000016Main API
17========
18run(...): Runs a command, waits for it to complete, then returns a
19 CompletedProcess instance.
20Popen(...): A class for flexibly executing a command in a new process
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000021
Martin Panter4afdca02016-10-25 22:20:48 +000022Constants
23---------
24DEVNULL: Special value that indicates that os.devnull should be used
25PIPE: Special value that indicates a pipe should be created
26STDOUT: Special value that indicates that stderr should go to stdout
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000027
28
Martin Panter4afdca02016-10-25 22:20:48 +000029Older API
30=========
31call(...): Runs a command, waits for it to complete, then returns
32 the return code.
33check_call(...): Same as call() but raises CalledProcessError()
34 if return code is not 0
35check_output(...): Same as check_call() but returns the contents of
36 stdout instead of a return code
37getoutput(...): Runs a command in the shell, waits for it to complete,
38 then returns the output
39getstatusoutput(...): Runs a command in the shell, waits for it to complete,
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -070040 then returns a (exitcode, output) tuple
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000041"""
42
Zachary Ware880d42a2018-09-10 16:16:08 -070043import builtins
44import errno
Guido van Rossumfa0054a2007-05-24 04:05:35 +000045import io
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000046import os
Reid Kleckner31aa7dd2011-03-14 12:02:10 -040047import time
Christian Heimesa342c012008-04-20 21:01:16 +000048import signal
Zachary Ware880d42a2018-09-10 16:16:08 -070049import sys
50import threading
Gregory P. Smithd23047b2010-12-04 09:10:44 +000051import warnings
Giampaolo Rodolabafa8482019-01-29 22:14:24 +010052import contextlib
Victor Stinnerae586492014-09-02 23:18:25 +020053from time import monotonic as _time
Guido van Rossum48b069a2020-04-07 09:50:06 -070054import types
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000055
Patrick McLean2b2ead72019-09-12 10:15:44 -070056try:
Ruben Vorderman23c0fb82020-10-20 01:30:02 +020057 import fcntl
58except ImportError:
59 fcntl = None
60
Zachary Ware880d42a2018-09-10 16:16:08 -070061
62__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput",
63 "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL",
64 "SubprocessError", "TimeoutExpired", "CompletedProcess"]
65 # NOTE: We intentionally exclude list2cmdline as it is
66 # considered an internal implementation detail. issue10838.
67
68try:
69 import msvcrt
70 import _winapi
71 _mswindows = True
72except ModuleNotFoundError:
73 _mswindows = False
74 import _posixsubprocess
75 import select
76 import selectors
77else:
78 from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
79 STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
80 STD_ERROR_HANDLE, SW_HIDE,
81 STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW,
82 ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
83 HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
84 NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
85 CREATE_NO_WINDOW, DETACHED_PROCESS,
86 CREATE_DEFAULT_ERROR_MODE, CREATE_BREAKAWAY_FROM_JOB)
87
88 __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP",
89 "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
90 "STD_ERROR_HANDLE", "SW_HIDE",
91 "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW",
92 "STARTUPINFO",
93 "ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
94 "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
95 "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS",
96 "CREATE_NO_WINDOW", "DETACHED_PROCESS",
97 "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"])
98
99
Peter Astrand454f7672005-01-01 09:36:35 +0000100# Exception classes used by this module.
Gregory P. Smith54d412e2011-03-14 14:08:43 -0400101class SubprocessError(Exception): pass
102
103
104class CalledProcessError(SubprocessError):
Martin Panter4afdca02016-10-25 22:20:48 +0000105 """Raised when run() is called with check=True and the process
106 returns a non-zero exit status.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)d6da7602016-06-03 06:14:06 +0000107
Martin Panter4afdca02016-10-25 22:20:48 +0000108 Attributes:
109 cmd, returncode, stdout, stderr, output
Georg Brandlf9734072008-12-07 15:30:06 +0000110 """
Gregory P. Smith6e730002015-04-14 16:14:25 -0700111 def __init__(self, returncode, cmd, output=None, stderr=None):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000112 self.returncode = returncode
113 self.cmd = cmd
Georg Brandlf9734072008-12-07 15:30:06 +0000114 self.output = output
Gregory P. Smith6e730002015-04-14 16:14:25 -0700115 self.stderr = stderr
116
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000117 def __str__(self):
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)d6da7602016-06-03 06:14:06 +0000118 if self.returncode and self.returncode < 0:
119 try:
120 return "Command '%s' died with %r." % (
121 self.cmd, signal.Signals(-self.returncode))
122 except ValueError:
123 return "Command '%s' died with unknown signal %d." % (
124 self.cmd, -self.returncode)
125 else:
126 return "Command '%s' returned non-zero exit status %d." % (
127 self.cmd, self.returncode)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000128
Gregory P. Smith6e730002015-04-14 16:14:25 -0700129 @property
130 def stdout(self):
131 """Alias for output attribute, to match stderr"""
132 return self.output
133
134 @stdout.setter
135 def stdout(self, value):
136 # There's no obvious reason to set this, but allow it anyway so
137 # .stdout is a transparent alias for .output
138 self.output = value
139
Peter Astrand454f7672005-01-01 09:36:35 +0000140
Gregory P. Smith54d412e2011-03-14 14:08:43 -0400141class TimeoutExpired(SubprocessError):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400142 """This exception is raised when the timeout expires while waiting for a
143 child process.
Martin Panter4afdca02016-10-25 22:20:48 +0000144
145 Attributes:
146 cmd, output, stdout, stderr, timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400147 """
Gregory P. Smith6e730002015-04-14 16:14:25 -0700148 def __init__(self, cmd, timeout, output=None, stderr=None):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400149 self.cmd = cmd
Reid Kleckner2b228f02011-03-16 16:57:54 -0400150 self.timeout = timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400151 self.output = output
Gregory P. Smith6e730002015-04-14 16:14:25 -0700152 self.stderr = stderr
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400153
154 def __str__(self):
155 return ("Command '%s' timed out after %s seconds" %
156 (self.cmd, self.timeout))
157
Gregory P. Smith6e730002015-04-14 16:14:25 -0700158 @property
159 def stdout(self):
160 return self.output
161
162 @stdout.setter
163 def stdout(self, value):
164 # There's no obvious reason to set this, but allow it anyway so
165 # .stdout is a transparent alias for .output
166 self.output = value
167
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400168
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700169if _mswindows:
Brian Curtin1ce6b582010-04-24 16:19:22 +0000170 class STARTUPINFO:
Subhendu Ghoshae160bb2017-02-25 20:29:05 +0530171 def __init__(self, *, dwFlags=0, hStdInput=None, hStdOutput=None,
Segev Finerb2a60832017-12-18 11:28:19 +0200172 hStdError=None, wShowWindow=0, lpAttributeList=None):
Subhendu Ghoshae160bb2017-02-25 20:29:05 +0530173 self.dwFlags = dwFlags
174 self.hStdInput = hStdInput
175 self.hStdOutput = hStdOutput
176 self.hStdError = hStdError
177 self.wShowWindow = wShowWindow
Segev Finerb2a60832017-12-18 11:28:19 +0200178 self.lpAttributeList = lpAttributeList or {"handle_list": []}
Victor Stinner483422f2018-07-05 22:54:17 +0200179
180 def copy(self):
181 attr_list = self.lpAttributeList.copy()
182 if 'handle_list' in attr_list:
183 attr_list['handle_list'] = list(attr_list['handle_list'])
184
185 return STARTUPINFO(dwFlags=self.dwFlags,
186 hStdInput=self.hStdInput,
187 hStdOutput=self.hStdOutput,
188 hStdError=self.hStdError,
189 wShowWindow=self.wShowWindow,
190 lpAttributeList=attr_list)
191
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200192
193 class Handle(int):
194 closed = False
195
196 def Close(self, CloseHandle=_winapi.CloseHandle):
197 if not self.closed:
198 self.closed = True
199 CloseHandle(self)
200
201 def Detach(self):
202 if not self.closed:
203 self.closed = True
204 return int(self)
205 raise ValueError("already closed")
206
207 def __repr__(self):
Serhiy Storchaka465e60e2014-07-25 23:36:00 +0300208 return "%s(%d)" % (self.__class__.__name__, int(self))
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200209
210 __del__ = Close
Zachary Ware880d42a2018-09-10 16:16:08 -0700211else:
212 # When select or poll has indicated that the file is writable,
213 # we can write up to _PIPE_BUF bytes without risk of blocking.
214 # POSIX defines PIPE_BUF as >= 512.
215 _PIPE_BUF = getattr(select, 'PIPE_BUF', 512)
216
217 # poll/select have the advantage of not requiring any extra file
218 # descriptor, contrarily to epoll/kqueue (also, they require a single
219 # syscall).
220 if hasattr(selectors, 'PollSelector'):
221 _PopenSelector = selectors.PollSelector
222 else:
223 _PopenSelector = selectors.SelectSelector
Antoine Pitrou23bba4c2012-04-18 20:51:15 +0200224
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000225
Ruslan Kuprieiev042821a2019-06-28 19:12:16 +0300226if _mswindows:
227 # On Windows we just need to close `Popen._handle` when we no longer need
228 # it, so that the kernel can free it. `Popen._handle` gets closed
229 # implicitly when the `Popen` instance is finalized (see `Handle.__del__`,
230 # which is calling `CloseHandle` as requested in [1]), so there is nothing
231 # for `_cleanup` to do.
232 #
233 # [1] https://docs.microsoft.com/en-us/windows/desktop/ProcThread/
234 # creating-processes
235 _active = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000236
Ruslan Kuprieiev042821a2019-06-28 19:12:16 +0300237 def _cleanup():
238 pass
239else:
240 # This lists holds Popen instances for which the underlying process had not
241 # exited at the time its __del__ method got called: those processes are
242 # wait()ed for synchronously from _cleanup() when a new Popen object is
243 # created, to avoid zombie processes.
244 _active = []
245
246 def _cleanup():
247 if _active is None:
248 return
249 for inst in _active[:]:
250 res = inst._internal_poll(_deadstate=sys.maxsize)
251 if res is not None:
252 try:
253 _active.remove(inst)
254 except ValueError:
255 # This can happen if two threads create a new Popen instance.
256 # It's harmless that it was already removed, so ignore.
257 pass
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000258
259PIPE = -1
260STDOUT = -2
Ross Lagerwallba102ec2011-03-16 18:40:25 +0200261DEVNULL = -3
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000262
263
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200264# XXX This function is only used by multiprocessing and the test suite,
265# but it's here so that it can be imported when Python is compiled without
266# threads.
267
Victor Stinner9def2842016-01-18 12:15:08 +0100268def _optim_args_from_interpreter_flags():
269 """Return a list of command-line arguments reproducing the current
270 optimization settings in sys.flags."""
271 args = []
272 value = sys.flags.optimize
273 if value > 0:
274 args.append('-' + 'O' * value)
275 return args
276
277
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200278def _args_from_interpreter_flags():
279 """Return a list of command-line arguments reproducing the current
Victor Stinner747f48e2017-12-12 22:59:48 +0100280 settings in sys.flags, sys.warnoptions and sys._xoptions."""
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200281 flag_opt_map = {
282 'debug': 'd',
283 # 'inspect': 'i',
284 # 'interactive': 'i',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200285 'dont_write_bytecode': 'B',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200286 'no_site': 'S',
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200287 'verbose': 'v',
288 'bytes_warning': 'b',
289 'quiet': 'q',
Victor Stinner9def2842016-01-18 12:15:08 +0100290 # -O is handled in _optim_args_from_interpreter_flags()
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200291 }
Victor Stinner9def2842016-01-18 12:15:08 +0100292 args = _optim_args_from_interpreter_flags()
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200293 for flag, opt in flag_opt_map.items():
294 v = getattr(sys.flags, flag)
295 if v > 0:
296 args.append('-' + opt * v)
Victor Stinnerf39b6742017-11-20 15:24:56 -0800297
Victor Stinner9de36322018-11-23 17:54:20 +0100298 if sys.flags.isolated:
299 args.append('-I')
300 else:
301 if sys.flags.ignore_environment:
302 args.append('-E')
303 if sys.flags.no_user_site:
304 args.append('-s')
305
Victor Stinnerf39b6742017-11-20 15:24:56 -0800306 # -W options
Victor Stinner747f48e2017-12-12 22:59:48 +0100307 warnopts = sys.warnoptions[:]
308 bytes_warning = sys.flags.bytes_warning
309 xoptions = getattr(sys, '_xoptions', {})
310 dev_mode = ('dev' in xoptions)
311
312 if bytes_warning > 1:
313 warnopts.remove("error::BytesWarning")
314 elif bytes_warning:
315 warnopts.remove("default::BytesWarning")
316 if dev_mode:
317 warnopts.remove('default')
318 for opt in warnopts:
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200319 args.append('-W' + opt)
Victor Stinnerf39b6742017-11-20 15:24:56 -0800320
321 # -X options
Victor Stinner747f48e2017-12-12 22:59:48 +0100322 if dev_mode:
Victor Stinnerf39b6742017-11-20 15:24:56 -0800323 args.extend(('-X', 'dev'))
324 for opt in ('faulthandler', 'tracemalloc', 'importtime',
Pablo Galindo1ed83ad2020-06-11 17:30:46 +0100325 'showrefcount', 'utf8'):
Victor Stinnerf39b6742017-11-20 15:24:56 -0800326 if opt in xoptions:
327 value = xoptions[opt]
328 if value is True:
329 arg = opt
330 else:
331 arg = '%s=%s' % (opt, value)
332 args.extend(('-X', arg))
333
Antoine Pitrouebdcd852012-05-18 18:33:07 +0200334 return args
335
336
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400337def call(*popenargs, timeout=None, **kwargs):
338 """Run command with arguments. Wait for command to complete or
339 timeout, then return the returncode attribute.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000340
341 The arguments are the same as for the Popen constructor. Example:
342
343 retcode = call(["ls", "-l"])
344 """
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200345 with Popen(*popenargs, **kwargs) as p:
346 try:
347 return p.wait(timeout=timeout)
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800348 except: # Including KeyboardInterrupt, wait handled that.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200349 p.kill()
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800350 # We don't call p.wait() again as p.__exit__ does that for us.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200351 raise
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000352
353
Peter Astrand454f7672005-01-01 09:36:35 +0000354def check_call(*popenargs, **kwargs):
355 """Run command with arguments. Wait for command to complete. If
356 the exit code was zero then return, otherwise raise
357 CalledProcessError. The CalledProcessError object will have the
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000358 return code in the returncode attribute.
Peter Astrand454f7672005-01-01 09:36:35 +0000359
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400360 The arguments are the same as for the call function. Example:
Peter Astrand454f7672005-01-01 09:36:35 +0000361
362 check_call(["ls", "-l"])
363 """
364 retcode = call(*popenargs, **kwargs)
Peter Astrand454f7672005-01-01 09:36:35 +0000365 if retcode:
Georg Brandlf9734072008-12-07 15:30:06 +0000366 cmd = kwargs.get("args")
367 if cmd is None:
368 cmd = popenargs[0]
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000369 raise CalledProcessError(retcode, cmd)
Georg Brandlf9734072008-12-07 15:30:06 +0000370 return 0
371
372
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400373def check_output(*popenargs, timeout=None, **kwargs):
Gregory P. Smith91110f52013-03-19 23:25:16 -0700374 r"""Run command with arguments and return its output.
Georg Brandlf9734072008-12-07 15:30:06 +0000375
376 If the exit code was non-zero it raises a CalledProcessError. The
377 CalledProcessError object will have the return code in the returncode
378 attribute and output in the output attribute.
379
380 The arguments are the same as for the Popen constructor. Example:
381
382 >>> check_output(["ls", "-l", "/dev/null"])
Georg Brandl2708f3a2009-12-20 14:38:23 +0000383 b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
Georg Brandlf9734072008-12-07 15:30:06 +0000384
385 The stdout argument is not allowed as it is used internally.
Georg Brandl127d4702009-12-28 08:10:38 +0000386 To capture standard error in the result, use stderr=STDOUT.
Georg Brandlf9734072008-12-07 15:30:06 +0000387
388 >>> check_output(["/bin/sh", "-c",
Georg Brandl2708f3a2009-12-20 14:38:23 +0000389 ... "ls -l non_existent_file ; exit 0"],
Georg Brandl127d4702009-12-28 08:10:38 +0000390 ... stderr=STDOUT)
Georg Brandl2708f3a2009-12-20 14:38:23 +0000391 b'ls: non_existent_file: No such file or directory\n'
Gregory P. Smith91110f52013-03-19 23:25:16 -0700392
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300393 There is an additional optional argument, "input", allowing you to
394 pass a string to the subprocess's stdin. If you use this argument
395 you may not also use the Popen constructor's "stdin" argument, as
396 it too will be used internally. Example:
397
398 >>> check_output(["sed", "-e", "s/foo/bar/"],
399 ... input=b"when in the course of fooman events\n")
400 b'when in the course of barman events\n'
401
andyclegg7fed7bd2017-10-23 03:01:19 +0100402 By default, all communication is in bytes, and therefore any "input"
Matthias182e1d12019-09-10 15:51:09 +0200403 should be bytes, and the return value will be bytes. If in text mode,
andyclegg7fed7bd2017-10-23 03:01:19 +0100404 any "input" should be a string, and the return value will be a string
405 decoded according to locale encoding, or by "encoding" if set. Text mode
406 is triggered by setting any of text, encoding, errors or universal_newlines.
Georg Brandlf9734072008-12-07 15:30:06 +0000407 """
408 if 'stdout' in kwargs:
409 raise ValueError('stdout argument not allowed, it will be overridden.')
Gregory P. Smith6e730002015-04-14 16:14:25 -0700410
411 if 'input' in kwargs and kwargs['input'] is None:
412 # Explicitly passing input=None was previously equivalent to passing an
413 # empty string. That is maintained here for backwards compatibility.
Gregory P. Smith64abf372020-12-24 20:57:21 -0800414 if kwargs.get('universal_newlines') or kwargs.get('text'):
415 empty = ''
416 else:
417 empty = b''
418 kwargs['input'] = empty
Gregory P. Smith6e730002015-04-14 16:14:25 -0700419
420 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
421 **kwargs).stdout
422
423
424class CompletedProcess(object):
425 """A process that has finished running.
426
427 This is returned by run().
428
429 Attributes:
430 args: The list or str args passed to run().
431 returncode: The exit code of the process, negative for signals.
432 stdout: The standard output (None if not captured).
433 stderr: The standard error (None if not captured).
434 """
435 def __init__(self, args, returncode, stdout=None, stderr=None):
436 self.args = args
437 self.returncode = returncode
438 self.stdout = stdout
439 self.stderr = stderr
440
441 def __repr__(self):
442 args = ['args={!r}'.format(self.args),
443 'returncode={!r}'.format(self.returncode)]
444 if self.stdout is not None:
445 args.append('stdout={!r}'.format(self.stdout))
446 if self.stderr is not None:
447 args.append('stderr={!r}'.format(self.stderr))
448 return "{}({})".format(type(self).__name__, ', '.join(args))
449
Guido van Rossum48b069a2020-04-07 09:50:06 -0700450 __class_getitem__ = classmethod(types.GenericAlias)
Batuhan Taşkaya4dc5a9d2019-12-30 19:02:04 +0300451
452
Gregory P. Smith6e730002015-04-14 16:14:25 -0700453 def check_returncode(self):
454 """Raise CalledProcessError if the exit code is non-zero."""
455 if self.returncode:
456 raise CalledProcessError(self.returncode, self.args, self.stdout,
457 self.stderr)
458
459
Bo Baylesce0f33d2018-01-30 00:40:39 -0600460def run(*popenargs,
461 input=None, capture_output=False, timeout=None, check=False, **kwargs):
Gregory P. Smith6e730002015-04-14 16:14:25 -0700462 """Run command with arguments and return a CompletedProcess instance.
463
464 The returned instance will have attributes args, returncode, stdout and
465 stderr. By default, stdout and stderr are not captured, and those attributes
466 will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them.
467
468 If check is True and the exit code was non-zero, it raises a
469 CalledProcessError. The CalledProcessError object will have the return code
470 in the returncode attribute, and output & stderr attributes if those streams
471 were captured.
472
473 If timeout is given, and the process takes too long, a TimeoutExpired
474 exception will be raised.
475
476 There is an optional argument "input", allowing you to
andyclegg7fed7bd2017-10-23 03:01:19 +0100477 pass bytes or a string to the subprocess's stdin. If you use this argument
Gregory P. Smith6e730002015-04-14 16:14:25 -0700478 you may not also use the Popen constructor's "stdin" argument, as
479 it will be used internally.
480
andyclegg7fed7bd2017-10-23 03:01:19 +0100481 By default, all communication is in bytes, and therefore any "input" should
482 be bytes, and the stdout and stderr will be bytes. If in text mode, any
483 "input" should be a string, and stdout and stderr will be strings decoded
484 according to locale encoding, or by "encoding" if set. Text mode is
485 triggered by setting any of text, encoding, errors or universal_newlines.
Gregory P. Smith6e730002015-04-14 16:14:25 -0700486
andyclegg7fed7bd2017-10-23 03:01:19 +0100487 The other arguments are the same as for the Popen constructor.
Gregory P. Smith6e730002015-04-14 16:14:25 -0700488 """
489 if input is not None:
Rémi Lapeyre8cc605a2019-06-08 16:56:24 +0200490 if kwargs.get('stdin') is not None:
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300491 raise ValueError('stdin and input arguments may not both be used.')
Serhiy Storchakafcd9f222013-04-22 20:20:54 +0300492 kwargs['stdin'] = PIPE
Gregory P. Smith6e730002015-04-14 16:14:25 -0700493
Bo Baylesce0f33d2018-01-30 00:40:39 -0600494 if capture_output:
Rémi Lapeyre8cc605a2019-06-08 16:56:24 +0200495 if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None:
Bo Baylesce0f33d2018-01-30 00:40:39 -0600496 raise ValueError('stdout and stderr arguments may not be used '
497 'with capture_output.')
498 kwargs['stdout'] = PIPE
499 kwargs['stderr'] = PIPE
500
Gregory P. Smith6e730002015-04-14 16:14:25 -0700501 with Popen(*popenargs, **kwargs) as process:
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200502 try:
Gregory P. Smith6e730002015-04-14 16:14:25 -0700503 stdout, stderr = process.communicate(input, timeout=timeout)
Gregory P. Smith580d2782019-09-11 04:23:05 -0500504 except TimeoutExpired as exc:
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200505 process.kill()
Gregory P. Smith580d2782019-09-11 04:23:05 -0500506 if _mswindows:
507 # Windows accumulates the output in a single blocking
508 # read() call run on child threads, with the timeout
509 # being done in a join() on those threads. communicate()
510 # _after_ kill() is required to collect that and add it
511 # to the exception.
512 exc.stdout, exc.stderr = process.communicate()
513 else:
514 # POSIX _communicate already populated the output so
515 # far into the TimeoutExpired exception.
516 process.wait()
517 raise
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800518 except: # Including KeyboardInterrupt, communicate handled that.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200519 process.kill()
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800520 # We don't call process.wait() as .__exit__ does that for us.
Victor Stinnerc15c88c2011-09-01 23:45:04 +0200521 raise
522 retcode = process.poll()
Gregory P. Smith6e730002015-04-14 16:14:25 -0700523 if check and retcode:
524 raise CalledProcessError(retcode, process.args,
525 output=stdout, stderr=stderr)
526 return CompletedProcess(process.args, retcode, stdout, stderr)
Peter Astrand454f7672005-01-01 09:36:35 +0000527
528
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000529def list2cmdline(seq):
530 """
531 Translate a sequence of arguments into a command line
532 string, using the same rules as the MS C runtime:
533
534 1) Arguments are delimited by white space, which is either a
535 space or a tab.
536
537 2) A string surrounded by double quotation marks is
538 interpreted as a single argument, regardless of white space
Jean-Paul Calderone1ddd4072010-06-18 20:03:54 +0000539 contained within. A quoted string can be embedded in an
540 argument.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000541
542 3) A double quotation mark preceded by a backslash is
543 interpreted as a literal double quotation mark.
544
545 4) Backslashes are interpreted literally, unless they
546 immediately precede a double quotation mark.
547
548 5) If backslashes immediately precede a double quotation mark,
549 every pair of backslashes is interpreted as a literal
550 backslash. If the number of backslashes is odd, the last
551 backslash escapes the next double quotation mark as
552 described in rule 3.
553 """
554
555 # See
Eric Smith3c573af2009-11-09 15:23:15 +0000556 # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
557 # or search http://msdn.microsoft.com for
558 # "Parsing C++ Command-Line Arguments"
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000559 result = []
560 needquote = False
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +0300561 for arg in map(os.fsdecode, seq):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000562 bs_buf = []
563
564 # Add a space to separate this argument from the others
565 if result:
566 result.append(' ')
567
Jean-Paul Calderone1ddd4072010-06-18 20:03:54 +0000568 needquote = (" " in arg) or ("\t" in arg) or not arg
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000569 if needquote:
570 result.append('"')
571
572 for c in arg:
573 if c == '\\':
Tim Peterse718f612004-10-12 21:51:32 +0000574 # Don't know if we need to double yet.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000575 bs_buf.append(c)
576 elif c == '"':
Christian Heimesfdab48e2008-01-20 09:06:41 +0000577 # Double backslashes.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000578 result.append('\\' * len(bs_buf)*2)
579 bs_buf = []
580 result.append('\\"')
581 else:
582 # Normal char
583 if bs_buf:
584 result.extend(bs_buf)
585 bs_buf = []
586 result.append(c)
587
Christian Heimesfdab48e2008-01-20 09:06:41 +0000588 # Add remaining backslashes, if any.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000589 if bs_buf:
590 result.extend(bs_buf)
591
592 if needquote:
Peter Astrand7e78ade2005-03-03 21:10:23 +0000593 result.extend(bs_buf)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000594 result.append('"')
595
596 return ''.join(result)
597
598
Brett Cannona23810f2008-05-26 19:04:21 +0000599# Various tools for executing commands and looking at their output and status.
600#
Brett Cannona23810f2008-05-26 19:04:21 +0000601
602def getstatusoutput(cmd):
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700603 """Return (exitcode, output) of executing cmd in a shell.
Brett Cannona23810f2008-05-26 19:04:21 +0000604
Tim Golden60798142013-11-05 12:57:25 +0000605 Execute the string 'cmd' in a shell with 'check_output' and
Steve Dower050acae2016-09-06 20:16:17 -0700606 return a 2-tuple (status, output). The locale encoding is used
607 to decode the output and process newlines.
Tim Golden60798142013-11-05 12:57:25 +0000608
609 A trailing newline is stripped from the output.
610 The exit status for the command can be interpreted
611 according to the rules for the function 'wait'. Example:
Brett Cannona23810f2008-05-26 19:04:21 +0000612
613 >>> import subprocess
614 >>> subprocess.getstatusoutput('ls /bin/ls')
615 (0, '/bin/ls')
616 >>> subprocess.getstatusoutput('cat /bin/junk')
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700617 (1, 'cat: /bin/junk: No such file or directory')
Brett Cannona23810f2008-05-26 19:04:21 +0000618 >>> subprocess.getstatusoutput('/bin/junk')
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700619 (127, 'sh: /bin/junk: not found')
620 >>> subprocess.getstatusoutput('/bin/kill $$')
621 (-15, '')
Brett Cannona23810f2008-05-26 19:04:21 +0000622 """
Tim Goldene0041752013-11-03 12:53:17 +0000623 try:
andyclegg7fed7bd2017-10-23 03:01:19 +0100624 data = check_output(cmd, shell=True, text=True, stderr=STDOUT)
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700625 exitcode = 0
Tim Goldene0041752013-11-03 12:53:17 +0000626 except CalledProcessError as ex:
627 data = ex.output
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700628 exitcode = ex.returncode
Tim Goldene0041752013-11-03 12:53:17 +0000629 if data[-1:] == '\n':
630 data = data[:-1]
Gregory P. Smith2eb0cb42017-09-07 16:11:02 -0700631 return exitcode, data
Brett Cannona23810f2008-05-26 19:04:21 +0000632
633def getoutput(cmd):
634 """Return output (stdout or stderr) of executing cmd in a shell.
635
636 Like getstatusoutput(), except the exit status is ignored and the return
637 value is a string containing the command's output. Example:
638
639 >>> import subprocess
640 >>> subprocess.getoutput('ls /bin/ls')
641 '/bin/ls'
642 """
643 return getstatusoutput(cmd)[1]
644
645
Victor Stinner9daecf32019-01-16 00:02:35 +0100646def _use_posix_spawn():
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800647 """Check if posix_spawn() can be used for subprocess.
Victor Stinner9daecf32019-01-16 00:02:35 +0100648
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800649 subprocess requires a posix_spawn() implementation that properly reports
650 errors to the parent process, & sets errno on the following failures:
Victor Stinner9daecf32019-01-16 00:02:35 +0100651
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800652 * Process attribute actions failed.
653 * File actions failed.
654 * exec() failed.
Victor Stinner9daecf32019-01-16 00:02:35 +0100655
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800656 Prefer an implementation which can use vfork() in some cases for best
657 performance.
Victor Stinner9daecf32019-01-16 00:02:35 +0100658 """
659 if _mswindows or not hasattr(os, 'posix_spawn'):
660 # os.posix_spawn() is not available
661 return False
662
Miss Islington (bot)826e0592021-08-17 11:33:34 -0700663 if sys.platform in ('darwin', 'sunos5'):
664 # posix_spawn() is a syscall on both macOS and Solaris,
665 # and properly reports errors
Victor Stinner9daecf32019-01-16 00:02:35 +0100666 return True
667
668 # Check libc name and runtime libc version
669 try:
670 ver = os.confstr('CS_GNU_LIBC_VERSION')
671 # parse 'glibc 2.28' as ('glibc', (2, 28))
672 parts = ver.split(maxsplit=1)
673 if len(parts) != 2:
674 # reject unknown format
675 raise ValueError
676 libc = parts[0]
677 version = tuple(map(int, parts[1].split('.')))
678
679 if sys.platform == 'linux' and libc == 'glibc' and version >= (2, 24):
680 # glibc 2.24 has a new Linux posix_spawn implementation using vfork
681 # which properly reports errors to the parent process.
682 return True
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800683 # Note: Don't use the implementation in earlier glibc because it doesn't
Victor Stinner9daecf32019-01-16 00:02:35 +0100684 # use vfork (even if glibc 2.26 added a pipe to properly report errors
685 # to the parent process).
686 except (AttributeError, ValueError, OSError):
687 # os.confstr() or CS_GNU_LIBC_VERSION value not available
688 pass
689
Gregory P. Smith81d04bc2019-01-26 15:19:11 -0800690 # By default, assume that posix_spawn() does not properly report errors.
Victor Stinner9daecf32019-01-16 00:02:35 +0100691 return False
692
693
694_USE_POSIX_SPAWN = _use_posix_spawn()
695
696
Inada Naoki48274832021-03-29 12:28:14 +0900697class Popen:
Martin Panter4afdca02016-10-25 22:20:48 +0000698 """ Execute a child program in a new process.
Serhiy Storchaka72e77612014-02-10 19:20:22 +0200699
Martin Panter4afdca02016-10-25 22:20:48 +0000700 For a complete description of the arguments see the Python documentation.
701
702 Arguments:
703 args: A string, or a sequence of program arguments.
704
705 bufsize: supplied as the buffering argument to the open() function when
706 creating the stdin/stdout/stderr pipe file objects
707
708 executable: A replacement program to execute.
709
710 stdin, stdout and stderr: These specify the executed programs' standard
711 input, standard output and standard error file handles, respectively.
712
713 preexec_fn: (POSIX only) An object to be called in the child process
714 just before the child is executed.
715
716 close_fds: Controls closing or inheriting of file descriptors.
717
718 shell: If true, the command will be executed through the shell.
719
720 cwd: Sets the current directory before the child is executed.
721
722 env: Defines the environment variables for the new process.
723
andyclegg7fed7bd2017-10-23 03:01:19 +0100724 text: If true, decode stdin, stdout and stderr using the given encoding
725 (if set) or the system default otherwise.
726
727 universal_newlines: Alias of text, provided for backwards compatibility.
Martin Panter4afdca02016-10-25 22:20:48 +0000728
729 startupinfo and creationflags (Windows only)
730
731 restore_signals (POSIX only)
732
733 start_new_session (POSIX only)
734
Patrick McLean2b2ead72019-09-12 10:15:44 -0700735 group (POSIX only)
736
737 extra_groups (POSIX only)
738
739 user (POSIX only)
740
Gregory P. Smithf3751ef2019-10-12 13:24:56 -0700741 umask (POSIX only)
742
Martin Panter4afdca02016-10-25 22:20:48 +0000743 pass_fds (POSIX only)
744
Martin Panter3dca6242016-10-25 23:41:42 +0000745 encoding and errors: Text mode encoding and error handling to use for
746 file objects stdin, stdout and stderr.
747
Martin Panter4afdca02016-10-25 22:20:48 +0000748 Attributes:
749 stdin, stdout, stderr, pid, returncode
750 """
Serhiy Storchaka72e77612014-02-10 19:20:22 +0200751 _child_created = False # Set here since __del__ checks it
752
Gregory P. Smitha1ed5392013-03-23 11:44:25 -0700753 def __init__(self, args, bufsize=-1, executable=None,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000754 stdin=None, stdout=None, stderr=None,
Segev Finerb2a60832017-12-18 11:28:19 +0200755 preexec_fn=None, close_fds=True,
andyclegg7fed7bd2017-10-23 03:01:19 +0100756 shell=False, cwd=None, env=None, universal_newlines=None,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000757 startupinfo=None, creationflags=0,
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000758 restore_signals=True, start_new_session=False,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700759 pass_fds=(), *, user=None, group=None, extra_groups=None,
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200760 encoding=None, errors=None, text=None, umask=-1, pipesize=-1):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000761 """Create new Popen instance."""
762 _cleanup()
Gregory P. Smithd65ba512014-04-23 00:27:17 -0700763 # Held while anything is calling waitpid before returncode has been
764 # updated to prevent clobbering returncode if wait() or poll() are
765 # called from multiple threads at once. After acquiring the lock,
766 # code must re-check self.returncode to see if another thread just
767 # finished a waitpid() call.
768 self._waitpid_lock = threading.Lock()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000769
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400770 self._input = None
771 self._communication_started = False
Guido van Rossum46a05a72007-06-07 21:56:45 +0000772 if bufsize is None:
Gregory P. Smitha1ed5392013-03-23 11:44:25 -0700773 bufsize = -1 # Restore default
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000774 if not isinstance(bufsize, int):
Peter Astrand738131d2004-11-30 21:04:45 +0000775 raise TypeError("bufsize must be an integer")
776
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200777 if pipesize is None:
778 pipesize = -1 # Restore default
779 if not isinstance(pipesize, int):
780 raise TypeError("pipesize must be an integer")
781
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700782 if _mswindows:
Tim Peterse8374a52004-10-13 03:15:00 +0000783 if preexec_fn is not None:
784 raise ValueError("preexec_fn is not supported on Windows "
785 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000786 else:
787 # POSIX
Gregory P. Smith8edd99d2010-12-14 13:43:30 +0000788 if pass_fds and not close_fds:
789 warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
790 close_fds = True
Tim Peterse8374a52004-10-13 03:15:00 +0000791 if startupinfo is not None:
792 raise ValueError("startupinfo is only supported on Windows "
793 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000794 if creationflags != 0:
Tim Peterse8374a52004-10-13 03:15:00 +0000795 raise ValueError("creationflags is only supported on Windows "
796 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000797
Reid Kleckner31aa7dd2011-03-14 12:02:10 -0400798 self.args = args
Tim Peterse718f612004-10-12 21:51:32 +0000799 self.stdin = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000800 self.stdout = None
801 self.stderr = None
802 self.pid = None
803 self.returncode = None
Steve Dower050acae2016-09-06 20:16:17 -0700804 self.encoding = encoding
805 self.errors = errors
Ruben Vorderman23c0fb82020-10-20 01:30:02 +0200806 self.pipesize = pipesize
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000807
andyclegg7fed7bd2017-10-23 03:01:19 +0100808 # Validate the combinations of text and universal_newlines
809 if (text is not None and universal_newlines is not None
810 and bool(universal_newlines) != bool(text)):
811 raise SubprocessError('Cannot disambiguate when both text '
812 'and universal_newlines are supplied but '
813 'different. Pass one or the other.')
814
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000815 # Input and output objects. The general principle is like
816 # this:
817 #
818 # Parent Child
819 # ------ -----
820 # p2cwrite ---stdin---> p2cread
821 # c2pread <--stdout--- c2pwrite
822 # errread <--stderr--- errwrite
823 #
824 # On POSIX, the child objects are file descriptors. On
825 # Windows, these are Windows file handles. The parent objects
826 # are file descriptors on both platforms. The parent objects
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000827 # are -1 when not using PIPEs. The child objects are -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000828 # when not redirecting.
Tim Peterse718f612004-10-12 21:51:32 +0000829
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000830 (p2cread, p2cwrite,
831 c2pread, c2pwrite,
832 errread, errwrite) = self._get_handles(stdin, stdout, stderr)
833
Antoine Pitrouc9982322011-01-04 19:07:07 +0000834 # We wrap OS handles *before* launching the child, otherwise a
835 # quickly terminating child could make our fds unwrappable
836 # (see #8458).
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000837
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -0700838 if _mswindows:
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000839 if p2cwrite != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000840 p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000841 if c2pread != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000842 c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
Florent Xicluna3b8bfef2010-03-14 12:31:06 +0000843 if errread != -1:
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +0000844 errread = msvcrt.open_osfhandle(errread.Detach(), 0)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000845
andyclegg7fed7bd2017-10-23 03:01:19 +0100846 self.text_mode = encoding or errors or text or universal_newlines
Tim Peterse718f612004-10-12 21:51:32 +0000847
Inada Naoki48274832021-03-29 12:28:14 +0900848 # PEP 597: We suppress the EncodingWarning in subprocess module
849 # for now (at Python 3.10), because we focus on files for now.
850 # This will be changed to encoding = io.text_encoding(encoding)
851 # in the future.
852 if self.text_mode and encoding is None:
853 self.encoding = encoding = "locale"
854
Gregory P. Smithf4d644f2018-01-29 21:27:39 -0800855 # How long to resume waiting on a child after the first ^C.
856 # There is no right value for this. The purpose is to be polite
857 # yet remain good for interactive users trying to exit a tool.
858 self._sigint_wait_secs = 0.25 # 1/xkcd221.getRandomNumber()
859
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700860 self._closed_child_pipe_fds = False
Steve Dower050acae2016-09-06 20:16:17 -0700861
Alexey Izbysheva2670562018-10-20 03:22:31 +0300862 if self.text_mode:
863 if bufsize == 1:
864 line_buffering = True
865 # Use the default buffer size for the underlying binary streams
866 # since they don't support line buffering.
867 bufsize = -1
868 else:
869 line_buffering = False
870
Patrick McLean2b2ead72019-09-12 10:15:44 -0700871 gid = None
872 if group is not None:
873 if not hasattr(os, 'setregid'):
874 raise ValueError("The 'group' parameter is not supported on the "
875 "current platform")
876
877 elif isinstance(group, str):
Victor Stinnerd72e8d42021-03-23 17:42:51 +0100878 try:
879 import grp
880 except ImportError:
Patrick McLean2b2ead72019-09-12 10:15:44 -0700881 raise ValueError("The group parameter cannot be a string "
882 "on systems without the grp module")
883
884 gid = grp.getgrnam(group).gr_gid
885 elif isinstance(group, int):
886 gid = group
887 else:
888 raise TypeError("Group must be a string or an integer, not {}"
889 .format(type(group)))
890
891 if gid < 0:
892 raise ValueError(f"Group ID cannot be negative, got {gid}")
893
894 gids = None
895 if extra_groups is not None:
896 if not hasattr(os, 'setgroups'):
897 raise ValueError("The 'extra_groups' parameter is not "
898 "supported on the current platform")
899
900 elif isinstance(extra_groups, str):
901 raise ValueError("Groups must be a list, not a string")
902
903 gids = []
904 for extra_group in extra_groups:
905 if isinstance(extra_group, str):
Victor Stinnerd72e8d42021-03-23 17:42:51 +0100906 try:
907 import grp
908 except ImportError:
Patrick McLean2b2ead72019-09-12 10:15:44 -0700909 raise ValueError("Items in extra_groups cannot be "
910 "strings on systems without the "
911 "grp module")
912
913 gids.append(grp.getgrnam(extra_group).gr_gid)
914 elif isinstance(extra_group, int):
915 gids.append(extra_group)
916 else:
917 raise TypeError("Items in extra_groups must be a string "
918 "or integer, not {}"
919 .format(type(extra_group)))
920
921 # make sure that the gids are all positive here so we can do less
922 # checking in the C code
923 for gid_check in gids:
924 if gid_check < 0:
925 raise ValueError(f"Group ID cannot be negative, got {gid_check}")
926
927 uid = None
928 if user is not None:
929 if not hasattr(os, 'setreuid'):
930 raise ValueError("The 'user' parameter is not supported on "
931 "the current platform")
932
933 elif isinstance(user, str):
Victor Stinnerd72e8d42021-03-23 17:42:51 +0100934 try:
935 import pwd
936 except ImportError:
Patrick McLean2b2ead72019-09-12 10:15:44 -0700937 raise ValueError("The user parameter cannot be a string "
938 "on systems without the pwd module")
Patrick McLean2b2ead72019-09-12 10:15:44 -0700939 uid = pwd.getpwnam(user).pw_uid
940 elif isinstance(user, int):
941 uid = user
942 else:
943 raise TypeError("User must be a string or an integer")
944
945 if uid < 0:
946 raise ValueError(f"User ID cannot be negative, got {uid}")
947
Antoine Pitrouc9982322011-01-04 19:07:07 +0000948 try:
Steve Dower050acae2016-09-06 20:16:17 -0700949 if p2cwrite != -1:
950 self.stdin = io.open(p2cwrite, 'wb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100951 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700952 self.stdin = io.TextIOWrapper(self.stdin, write_through=True,
Alexey Izbysheva2670562018-10-20 03:22:31 +0300953 line_buffering=line_buffering,
Steve Dower050acae2016-09-06 20:16:17 -0700954 encoding=encoding, errors=errors)
955 if c2pread != -1:
956 self.stdout = io.open(c2pread, 'rb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100957 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700958 self.stdout = io.TextIOWrapper(self.stdout,
959 encoding=encoding, errors=errors)
960 if errread != -1:
961 self.stderr = io.open(errread, 'rb', bufsize)
andyclegg7fed7bd2017-10-23 03:01:19 +0100962 if self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -0700963 self.stderr = io.TextIOWrapper(self.stderr,
964 encoding=encoding, errors=errors)
965
Antoine Pitrouc9982322011-01-04 19:07:07 +0000966 self._execute_child(args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +0300967 pass_fds, cwd, env,
Antoine Pitrouc9982322011-01-04 19:07:07 +0000968 startupinfo, creationflags, shell,
969 p2cread, p2cwrite,
970 c2pread, c2pwrite,
971 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700972 restore_signals,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -0700973 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -0700974 start_new_session)
Antoine Pitrouc9982322011-01-04 19:07:07 +0000975 except:
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800976 # Cleanup if the child failed starting.
977 for f in filter(None, (self.stdin, self.stdout, self.stderr)):
Antoine Pitrouc9982322011-01-04 19:07:07 +0000978 try:
979 f.close()
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200980 except OSError:
Gregory P. Smith3d8e7762012-11-10 22:32:22 -0800981 pass # Ignore EBADF or other errors.
982
Gregory P. Smithb5461b92013-06-15 18:04:26 -0700983 if not self._closed_child_pipe_fds:
984 to_close = []
985 if stdin == PIPE:
986 to_close.append(p2cread)
987 if stdout == PIPE:
988 to_close.append(c2pwrite)
989 if stderr == PIPE:
990 to_close.append(errwrite)
991 if hasattr(self, '_devnull'):
992 to_close.append(self._devnull)
993 for fd in to_close:
994 try:
Segev Finer4d385172017-08-18 16:18:13 +0300995 if _mswindows and isinstance(fd, Handle):
996 fd.Close()
997 else:
998 os.close(fd)
Gregory P. Smith22ba31a2013-06-15 18:14:56 -0700999 except OSError:
Gregory P. Smithb5461b92013-06-15 18:04:26 -07001000 pass
Gregory P. Smith3d8e7762012-11-10 22:32:22 -08001001
Antoine Pitrouc9982322011-01-04 19:07:07 +00001002 raise
1003
Andrey Doroschenko645005e2019-11-17 17:08:31 +03001004 def __repr__(self):
1005 obj_repr = (
1006 f"<{self.__class__.__name__}: "
M. Kocherdb0c5b72021-04-28 01:16:38 -07001007 f"returncode: {self.returncode} args: {self.args!r}>"
Andrey Doroschenko645005e2019-11-17 17:08:31 +03001008 )
1009 if len(obj_repr) > 80:
1010 obj_repr = obj_repr[:76] + "...>"
1011 return obj_repr
1012
Guido van Rossum48b069a2020-04-07 09:50:06 -07001013 __class_getitem__ = classmethod(types.GenericAlias)
Batuhan Taşkaya4dc5a9d2019-12-30 19:02:04 +03001014
andyclegg7fed7bd2017-10-23 03:01:19 +01001015 @property
1016 def universal_newlines(self):
1017 # universal_newlines as retained as an alias of text_mode for API
luzpaza5293b42017-11-05 07:37:50 -06001018 # compatibility. bpo-31756
andyclegg7fed7bd2017-10-23 03:01:19 +01001019 return self.text_mode
1020
1021 @universal_newlines.setter
1022 def universal_newlines(self, universal_newlines):
1023 self.text_mode = bool(universal_newlines)
1024
Steve Dower050acae2016-09-06 20:16:17 -07001025 def _translate_newlines(self, data, encoding, errors):
1026 data = data.decode(encoding, errors)
Andrew Svetlov82860712012-08-19 22:13:41 +03001027 return data.replace("\r\n", "\n").replace("\r", "\n")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001028
Brian Curtin79cdb662010-12-03 02:46:02 +00001029 def __enter__(self):
1030 return self
1031
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001032 def __exit__(self, exc_type, value, traceback):
Brian Curtin79cdb662010-12-03 02:46:02 +00001033 if self.stdout:
1034 self.stdout.close()
1035 if self.stderr:
1036 self.stderr.close()
Serhiy Storchakaab900c22015-02-28 12:43:08 +02001037 try: # Flushing a BufferedWriter may raise an error
1038 if self.stdin:
1039 self.stdin.close()
1040 finally:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001041 if exc_type == KeyboardInterrupt:
1042 # https://bugs.python.org/issue25942
1043 # In the case of a KeyboardInterrupt we assume the SIGINT
1044 # was also already sent to our child processes. We can't
1045 # block indefinitely as that is not user friendly.
1046 # If we have not already waited a brief amount of time in
1047 # an interrupted .wait() or .communicate() call, do so here
1048 # for consistency.
1049 if self._sigint_wait_secs > 0:
1050 try:
1051 self._wait(timeout=self._sigint_wait_secs)
1052 except TimeoutExpired:
1053 pass
1054 self._sigint_wait_secs = 0 # Note that this has been done.
1055 return # resume the KeyboardInterrupt
1056
Serhiy Storchakaab900c22015-02-28 12:43:08 +02001057 # Wait for the process to terminate, to avoid zombies.
1058 self.wait()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001059
Victor Stinner9505b032017-01-06 10:44:44 +01001060 def __del__(self, _maxsize=sys.maxsize, _warn=warnings.warn):
Serhiy Storchaka72e77612014-02-10 19:20:22 +02001061 if not self._child_created:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001062 # We didn't get to successfully create a child process.
1063 return
Victor Stinner5a48e212016-05-20 12:11:15 +02001064 if self.returncode is None:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001065 # Not reading subprocess exit status creates a zombie process which
Victor Stinnerc206f1e2016-06-14 16:42:59 +02001066 # is only destroyed at the parent python process exit
Victor Stinner9505b032017-01-06 10:44:44 +01001067 _warn("subprocess %s is still running" % self.pid,
1068 ResourceWarning, source=self)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001069 # In case the child hasn't been waited on, check if it's done.
Brett Cannon84df1e62010-05-14 00:33:40 +00001070 self._internal_poll(_deadstate=_maxsize)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001071 if self.returncode is None and _active is not None:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001072 # Child is still running, keep us alive until we can wait on it.
1073 _active.append(self)
1074
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001075 def _get_devnull(self):
1076 if not hasattr(self, '_devnull'):
1077 self._devnull = os.open(os.devnull, os.O_RDWR)
1078 return self._devnull
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001079
Victor Stinnera5e881d2015-01-14 17:07:59 +01001080 def _stdin_write(self, input):
1081 if input:
1082 try:
1083 self.stdin.write(input)
1084 except BrokenPipeError:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001085 pass # communicate() must ignore broken pipe errors.
Victor Stinnerd52aa312017-06-08 17:30:39 +02001086 except OSError as exc:
1087 if exc.errno == errno.EINVAL:
1088 # bpo-19612, bpo-30418: On Windows, stdin.write() fails
1089 # with EINVAL if the child process exited or if the child
1090 # process is still running but closed the pipe.
Victor Stinnera5e881d2015-01-14 17:07:59 +01001091 pass
1092 else:
1093 raise
Victor Stinnerd52aa312017-06-08 17:30:39 +02001094
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001095 try:
1096 self.stdin.close()
1097 except BrokenPipeError:
1098 pass # communicate() must ignore broken pipe errors.
Victor Stinnerd52aa312017-06-08 17:30:39 +02001099 except OSError as exc:
1100 if exc.errno == errno.EINVAL:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001101 pass
1102 else:
1103 raise
Victor Stinnera5e881d2015-01-14 17:07:59 +01001104
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001105 def communicate(self, input=None, timeout=None):
Joel Schaerer88031a92017-09-13 21:11:20 +02001106 """Interact with process: Send data to stdin and close it.
1107 Read data from stdout and stderr, until end-of-file is
1108 reached. Wait for process to terminate.
Tim Peterseba28be2005-03-28 01:08:02 +00001109
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001110 The optional "input" argument should be data to be sent to the
andyclegg7fed7bd2017-10-23 03:01:19 +01001111 child process, or None, if no data should be sent to the child.
1112 communicate() returns a tuple (stdout, stderr).
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001113
andyclegg7fed7bd2017-10-23 03:01:19 +01001114 By default, all communication is in bytes, and therefore any
1115 "input" should be bytes, and the (stdout, stderr) will be bytes.
1116 If in text mode (indicated by self.text_mode), any "input" should
1117 be a string, and (stdout, stderr) will be strings decoded
1118 according to locale encoding, or by "encoding" if set. Text mode
1119 is triggered by setting any of text, encoding, errors or
1120 universal_newlines.
Andrew Kuchling4f7b0c32014-04-14 15:08:18 -04001121 """
Peter Astrand23109f02005-03-03 20:28:59 +00001122
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001123 if self._communication_started and input:
1124 raise ValueError("Cannot send input after starting communication")
1125
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001126 # Optimization: If we are not worried about timeouts, we haven't
1127 # started communicating, and we have one or zero pipes, using select()
1128 # or threads is unnecessary.
Victor Stinner7a8d0812011-04-05 13:13:08 +02001129 if (timeout is None and not self._communication_started and
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001130 [self.stdin, self.stdout, self.stderr].count(None) >= 2):
Tim Peterseba28be2005-03-28 01:08:02 +00001131 stdout = None
1132 stderr = None
Peter Astrand23109f02005-03-03 20:28:59 +00001133 if self.stdin:
Victor Stinnera5e881d2015-01-14 17:07:59 +01001134 self._stdin_write(input)
Peter Astrand23109f02005-03-03 20:28:59 +00001135 elif self.stdout:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001136 stdout = self.stdout.read()
Georg Brandlf08a9dd2008-06-10 16:57:31 +00001137 self.stdout.close()
Peter Astrand23109f02005-03-03 20:28:59 +00001138 elif self.stderr:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001139 stderr = self.stderr.read()
Georg Brandlf08a9dd2008-06-10 16:57:31 +00001140 self.stderr.close()
Peter Astrand23109f02005-03-03 20:28:59 +00001141 self.wait()
Victor Stinner7a8d0812011-04-05 13:13:08 +02001142 else:
1143 if timeout is not None:
Victor Stinner949d8c92012-05-30 13:30:32 +02001144 endtime = _time() + timeout
Victor Stinner7a8d0812011-04-05 13:13:08 +02001145 else:
1146 endtime = None
Tim Peterseba28be2005-03-28 01:08:02 +00001147
Victor Stinner7a8d0812011-04-05 13:13:08 +02001148 try:
1149 stdout, stderr = self._communicate(input, endtime, timeout)
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001150 except KeyboardInterrupt:
1151 # https://bugs.python.org/issue25942
1152 # See the detailed comment in .wait().
1153 if timeout is not None:
1154 sigint_timeout = min(self._sigint_wait_secs,
1155 self._remaining_time(endtime))
1156 else:
1157 sigint_timeout = self._sigint_wait_secs
1158 self._sigint_wait_secs = 0 # nothing else should wait.
1159 try:
1160 self._wait(timeout=sigint_timeout)
1161 except TimeoutExpired:
1162 pass
1163 raise # resume the KeyboardInterrupt
1164
Victor Stinner7a8d0812011-04-05 13:13:08 +02001165 finally:
1166 self._communication_started = True
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001167
Victor Stinner7a8d0812011-04-05 13:13:08 +02001168 sts = self.wait(timeout=self._remaining_time(endtime))
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001169
1170 return (stdout, stderr)
Peter Astrand23109f02005-03-03 20:28:59 +00001171
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001172
Georg Brandl6aa2d1f2008-08-12 08:35:52 +00001173 def poll(self):
Martin Panter4afdca02016-10-25 22:20:48 +00001174 """Check if child process has terminated. Set and return returncode
1175 attribute."""
Georg Brandl6aa2d1f2008-08-12 08:35:52 +00001176 return self._internal_poll()
1177
1178
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001179 def _remaining_time(self, endtime):
1180 """Convenience for _communicate when computing timeouts."""
1181 if endtime is None:
1182 return None
1183 else:
Victor Stinner949d8c92012-05-30 13:30:32 +02001184 return endtime - _time()
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001185
1186
Gregory P. Smith580d2782019-09-11 04:23:05 -05001187 def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq,
1188 skip_check_and_raise=False):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001189 """Convenience for checking if a timeout has expired."""
1190 if endtime is None:
1191 return
Gregory P. Smith580d2782019-09-11 04:23:05 -05001192 if skip_check_and_raise or _time() > endtime:
1193 raise TimeoutExpired(
1194 self.args, orig_timeout,
1195 output=b''.join(stdout_seq) if stdout_seq else None,
1196 stderr=b''.join(stderr_seq) if stderr_seq else None)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001197
1198
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001199 def wait(self, timeout=None):
1200 """Wait for child process to terminate; returns self.returncode."""
1201 if timeout is not None:
1202 endtime = _time() + timeout
1203 try:
1204 return self._wait(timeout=timeout)
1205 except KeyboardInterrupt:
1206 # https://bugs.python.org/issue25942
1207 # The first keyboard interrupt waits briefly for the child to
1208 # exit under the common assumption that it also received the ^C
1209 # generated SIGINT and will exit rapidly.
1210 if timeout is not None:
1211 sigint_timeout = min(self._sigint_wait_secs,
1212 self._remaining_time(endtime))
1213 else:
1214 sigint_timeout = self._sigint_wait_secs
1215 self._sigint_wait_secs = 0 # nothing else should wait.
1216 try:
1217 self._wait(timeout=sigint_timeout)
1218 except TimeoutExpired:
1219 pass
1220 raise # resume the KeyboardInterrupt
1221
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001222 def _close_pipe_fds(self,
1223 p2cread, p2cwrite,
1224 c2pread, c2pwrite,
1225 errread, errwrite):
1226 # self._devnull is not always defined.
1227 devnull_fd = getattr(self, '_devnull', None)
1228
Giampaolo Rodolabafa8482019-01-29 22:14:24 +01001229 with contextlib.ExitStack() as stack:
1230 if _mswindows:
1231 if p2cread != -1:
1232 stack.callback(p2cread.Close)
1233 if c2pwrite != -1:
1234 stack.callback(c2pwrite.Close)
1235 if errwrite != -1:
1236 stack.callback(errwrite.Close)
1237 else:
1238 if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
1239 stack.callback(os.close, p2cread)
1240 if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
1241 stack.callback(os.close, c2pwrite)
1242 if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
1243 stack.callback(os.close, errwrite)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001244
Giampaolo Rodolabafa8482019-01-29 22:14:24 +01001245 if devnull_fd is not None:
1246 stack.callback(os.close, devnull_fd)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001247
1248 # Prevent a double close of these handles/fds from __init__ on error.
1249 self._closed_child_pipe_fds = True
1250
Gregory P. Smithcb6fdf22015-04-07 16:11:33 -07001251 if _mswindows:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001252 #
1253 # Windows methods
1254 #
1255 def _get_handles(self, stdin, stdout, stderr):
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +00001256 """Construct and return tuple with IO objects:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001257 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1258 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001259 if stdin is None and stdout is None and stderr is None:
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001260 return (-1, -1, -1, -1, -1, -1)
Tim Peterse718f612004-10-12 21:51:32 +00001261
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001262 p2cread, p2cwrite = -1, -1
1263 c2pread, c2pwrite = -1, -1
1264 errread, errwrite = -1, -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001265
Peter Astrandd38ddf42005-02-10 08:32:50 +00001266 if stdin is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001267 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001268 if p2cread is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001269 p2cread, _ = _winapi.CreatePipe(None, 0)
1270 p2cread = Handle(p2cread)
1271 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001272 elif stdin == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001273 p2cread, p2cwrite = _winapi.CreatePipe(None, 0)
1274 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001275 elif stdin == DEVNULL:
1276 p2cread = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001277 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001278 p2cread = msvcrt.get_osfhandle(stdin)
1279 else:
1280 # Assuming file-like object
1281 p2cread = msvcrt.get_osfhandle(stdin.fileno())
1282 p2cread = self._make_inheritable(p2cread)
1283
Peter Astrandd38ddf42005-02-10 08:32:50 +00001284 if stdout is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001285 c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001286 if c2pwrite is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001287 _, c2pwrite = _winapi.CreatePipe(None, 0)
1288 c2pwrite = Handle(c2pwrite)
1289 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001290 elif stdout == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001291 c2pread, c2pwrite = _winapi.CreatePipe(None, 0)
1292 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001293 elif stdout == DEVNULL:
1294 c2pwrite = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001295 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001296 c2pwrite = msvcrt.get_osfhandle(stdout)
1297 else:
1298 # Assuming file-like object
1299 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
1300 c2pwrite = self._make_inheritable(c2pwrite)
1301
Peter Astrandd38ddf42005-02-10 08:32:50 +00001302 if stderr is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001303 errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001304 if errwrite is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001305 _, errwrite = _winapi.CreatePipe(None, 0)
1306 errwrite = Handle(errwrite)
1307 _winapi.CloseHandle(_)
Hirokazu Yamamoto0c988172009-03-03 22:41:26 +00001308 elif stderr == PIPE:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001309 errread, errwrite = _winapi.CreatePipe(None, 0)
1310 errread, errwrite = Handle(errread), Handle(errwrite)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001311 elif stderr == STDOUT:
1312 errwrite = c2pwrite
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001313 elif stderr == DEVNULL:
1314 errwrite = msvcrt.get_osfhandle(self._get_devnull())
Peter Astrandd38ddf42005-02-10 08:32:50 +00001315 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001316 errwrite = msvcrt.get_osfhandle(stderr)
1317 else:
1318 # Assuming file-like object
1319 errwrite = msvcrt.get_osfhandle(stderr.fileno())
1320 errwrite = self._make_inheritable(errwrite)
1321
1322 return (p2cread, p2cwrite,
1323 c2pread, c2pwrite,
1324 errread, errwrite)
1325
1326
1327 def _make_inheritable(self, handle):
1328 """Return a duplicate of handle, which is inheritable"""
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001329 h = _winapi.DuplicateHandle(
1330 _winapi.GetCurrentProcess(), handle,
1331 _winapi.GetCurrentProcess(), 0, 1,
1332 _winapi.DUPLICATE_SAME_ACCESS)
1333 return Handle(h)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001334
1335
Segev Finerb2a60832017-12-18 11:28:19 +02001336 def _filter_handle_list(self, handle_list):
1337 """Filter out console handles that can't be used
1338 in lpAttributeList["handle_list"] and make sure the list
1339 isn't empty. This also removes duplicate handles."""
1340 # An handle with it's lowest two bits set might be a special console
1341 # handle that if passed in lpAttributeList["handle_list"], will
1342 # cause it to fail.
1343 return list({handle for handle in handle_list
1344 if handle & 0x3 != 0x3
1345 or _winapi.GetFileType(handle) !=
1346 _winapi.FILE_TYPE_CHAR})
1347
1348
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001349 def _execute_child(self, args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +03001350 pass_fds, cwd, env,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001351 startupinfo, creationflags, shell,
1352 p2cread, p2cwrite,
1353 c2pread, c2pwrite,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001354 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001355 unused_restore_signals,
1356 unused_gid, unused_gids, unused_uid,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001357 unused_umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001358 unused_start_new_session):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001359 """Execute program (MS Windows version)"""
1360
Gregory P. Smith8edd99d2010-12-14 13:43:30 +00001361 assert not pass_fds, "pass_fds not supported on Windows."
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +00001362
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001363 if isinstance(args, str):
1364 pass
1365 elif isinstance(args, bytes):
1366 if shell:
1367 raise TypeError('bytes args is not allowed on Windows')
1368 args = list2cmdline([args])
1369 elif isinstance(args, os.PathLike):
1370 if shell:
1371 raise TypeError('path-like args is not allowed when '
1372 'shell is true')
1373 args = list2cmdline([args])
1374 else:
Serhiy Storchakabe50a7b2018-02-28 01:03:46 +02001375 args = list2cmdline(args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001376
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001377 if executable is not None:
1378 executable = os.fsdecode(executable)
1379
Peter Astrandc1d65362004-11-07 14:30:34 +00001380 # Process startup details
Peter Astrandd38ddf42005-02-10 08:32:50 +00001381 if startupinfo is None:
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001382 startupinfo = STARTUPINFO()
Victor Stinner483422f2018-07-05 22:54:17 +02001383 else:
1384 # bpo-34044: Copy STARTUPINFO since it is modified above,
1385 # so the caller can reuse it multiple times.
1386 startupinfo = startupinfo.copy()
Segev Finerb2a60832017-12-18 11:28:19 +02001387
1388 use_std_handles = -1 not in (p2cread, c2pwrite, errwrite)
1389 if use_std_handles:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001390 startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES
Peter Astrandc1d65362004-11-07 14:30:34 +00001391 startupinfo.hStdInput = p2cread
1392 startupinfo.hStdOutput = c2pwrite
1393 startupinfo.hStdError = errwrite
1394
Segev Finerb2a60832017-12-18 11:28:19 +02001395 attribute_list = startupinfo.lpAttributeList
1396 have_handle_list = bool(attribute_list and
1397 "handle_list" in attribute_list and
1398 attribute_list["handle_list"])
1399
1400 # If we were given an handle_list or need to create one
1401 if have_handle_list or (use_std_handles and close_fds):
1402 if attribute_list is None:
1403 attribute_list = startupinfo.lpAttributeList = {}
1404 handle_list = attribute_list["handle_list"] = \
1405 list(attribute_list.get("handle_list", []))
1406
1407 if use_std_handles:
1408 handle_list += [int(p2cread), int(c2pwrite), int(errwrite)]
1409
1410 handle_list[:] = self._filter_handle_list(handle_list)
1411
1412 if handle_list:
1413 if not close_fds:
1414 warnings.warn("startupinfo.lpAttributeList['handle_list'] "
1415 "overriding close_fds", RuntimeWarning)
1416
1417 # When using the handle_list we always request to inherit
1418 # handles but the only handles that will be inherited are
1419 # the ones in the handle_list
1420 close_fds = False
1421
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001422 if shell:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001423 startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW
1424 startupinfo.wShowWindow = _winapi.SW_HIDE
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001425 comspec = os.environ.get("COMSPEC", "cmd.exe")
Tim Golden126c2962010-08-11 14:20:40 +00001426 args = '{} /c "{}"'.format (comspec, args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001427
Steve Dower60419a72019-06-24 08:42:54 -07001428 if cwd is not None:
1429 cwd = os.fsdecode(cwd)
1430
1431 sys.audit("subprocess.Popen", executable, args, cwd, env)
1432
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001433 # Start the process
1434 try:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001435 hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
Tim Peterse8374a52004-10-13 03:15:00 +00001436 # no special security
1437 None, None,
Guido van Rossume7ba4952007-06-06 23:52:48 +00001438 int(not close_fds),
Tim Peterse8374a52004-10-13 03:15:00 +00001439 creationflags,
1440 env,
Steve Dower60419a72019-06-24 08:42:54 -07001441 cwd,
Tim Peterse8374a52004-10-13 03:15:00 +00001442 startupinfo)
Tim Goldenad537f22010-08-08 11:18:16 +00001443 finally:
1444 # Child is launched. Close the parent's copy of those pipe
1445 # handles that only the child should have open. You need
1446 # to make sure that no handles to the write end of the
1447 # output pipe are maintained in this process or else the
1448 # pipe will not close when the child process exits and the
1449 # ReadFile will hang.
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001450 self._close_pipe_fds(p2cread, p2cwrite,
1451 c2pread, c2pwrite,
1452 errread, errwrite)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001453
1454 # Retain the process handle, but close the thread handle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001455 self._child_created = True
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001456 self._handle = Handle(hp)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001457 self.pid = pid
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001458 _winapi.CloseHandle(ht)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001459
Brett Cannon84df1e62010-05-14 00:33:40 +00001460 def _internal_poll(self, _deadstate=None,
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001461 _WaitForSingleObject=_winapi.WaitForSingleObject,
1462 _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0,
1463 _GetExitCodeProcess=_winapi.GetExitCodeProcess):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001464 """Check if child process has terminated. Returns returncode
Brett Cannon84df1e62010-05-14 00:33:40 +00001465 attribute.
1466
1467 This method is called by __del__, so it can only refer to objects
1468 in its local scope.
1469
1470 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001471 if self.returncode is None:
Brett Cannon84df1e62010-05-14 00:33:40 +00001472 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
1473 self.returncode = _GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001474 return self.returncode
1475
1476
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001477 def _wait(self, timeout):
1478 """Internal implementation of wait() on Windows."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001479 if timeout is None:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001480 timeout_millis = _winapi.INFINITE
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001481 else:
Reid Kleckner91156ff2011-03-21 10:06:10 -07001482 timeout_millis = int(timeout * 1000)
Peter Astrandd38ddf42005-02-10 08:32:50 +00001483 if self.returncode is None:
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001484 # API note: Returns immediately if timeout_millis == 0.
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001485 result = _winapi.WaitForSingleObject(self._handle,
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001486 timeout_millis)
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001487 if result == _winapi.WAIT_TIMEOUT:
Reid Kleckner2b228f02011-03-16 16:57:54 -04001488 raise TimeoutExpired(self.args, timeout)
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001489 self.returncode = _winapi.GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001490 return self.returncode
1491
1492
1493 def _readerthread(self, fh, buffer):
1494 buffer.append(fh.read())
Victor Stinner667d4b52010-12-25 22:40:32 +00001495 fh.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001496
1497
Reid Kleckner2b228f02011-03-16 16:57:54 -04001498 def _communicate(self, input, endtime, orig_timeout):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001499 # Start reader threads feeding into a list hanging off of this
1500 # object, unless they've already been started.
1501 if self.stdout and not hasattr(self, "_stdout_buff"):
1502 self._stdout_buff = []
1503 self.stdout_thread = \
1504 threading.Thread(target=self._readerthread,
1505 args=(self.stdout, self._stdout_buff))
1506 self.stdout_thread.daemon = True
1507 self.stdout_thread.start()
1508 if self.stderr and not hasattr(self, "_stderr_buff"):
1509 self._stderr_buff = []
1510 self.stderr_thread = \
1511 threading.Thread(target=self._readerthread,
1512 args=(self.stderr, self._stderr_buff))
1513 self.stderr_thread.daemon = True
1514 self.stderr_thread.start()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001515
1516 if self.stdin:
Victor Stinnera5e881d2015-01-14 17:07:59 +01001517 self._stdin_write(input)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001518
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001519 # Wait for the reader threads, or time out. If we time out, the
1520 # threads remain reading and the fds left open in case the user
1521 # calls communicate again.
1522 if self.stdout is not None:
1523 self.stdout_thread.join(self._remaining_time(endtime))
Andrew Svetlov377a1522012-08-19 20:49:39 +03001524 if self.stdout_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 if self.stderr is not None:
1527 self.stderr_thread.join(self._remaining_time(endtime))
Andrew Svetlov377a1522012-08-19 20:49:39 +03001528 if self.stderr_thread.is_alive():
Reid Kleckner9a67e6c2011-03-20 08:28:07 -07001529 raise TimeoutExpired(self.args, orig_timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001530
1531 # Collect the output from and close both pipes, now that we know
1532 # both have been read successfully.
1533 stdout = None
1534 stderr = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001535 if self.stdout:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001536 stdout = self._stdout_buff
1537 self.stdout.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001538 if self.stderr:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001539 stderr = self._stderr_buff
1540 self.stderr.close()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001541
1542 # All data exchanged. Translate lists into strings.
Chris Griffithb4fc44b2021-03-11 13:43:29 -06001543 stdout = stdout[0] if stdout else None
1544 stderr = stderr[0] if stderr else None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001545
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001546 return (stdout, stderr)
1547
Christian Heimesa342c012008-04-20 21:01:16 +00001548 def send_signal(self, sig):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08001549 """Send a signal to the process."""
1550 # Don't signal a process that we know has already died.
1551 if self.returncode is not None:
1552 return
Christian Heimesa342c012008-04-20 21:01:16 +00001553 if sig == signal.SIGTERM:
1554 self.terminate()
Brian Curtineb24d742010-04-12 17:16:38 +00001555 elif sig == signal.CTRL_C_EVENT:
1556 os.kill(self.pid, signal.CTRL_C_EVENT)
1557 elif sig == signal.CTRL_BREAK_EVENT:
1558 os.kill(self.pid, signal.CTRL_BREAK_EVENT)
Christian Heimesa342c012008-04-20 21:01:16 +00001559 else:
Brian Curtin19651362010-09-07 13:24:38 +00001560 raise ValueError("Unsupported signal: {}".format(sig))
Christian Heimesa342c012008-04-20 21:01:16 +00001561
1562 def terminate(self):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08001563 """Terminates the process."""
1564 # Don't terminate a process that we know has already died.
1565 if self.returncode is not None:
1566 return
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001567 try:
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001568 _winapi.TerminateProcess(self._handle, 1)
Antoine Pitroub69ef162012-03-11 19:33:29 +01001569 except PermissionError:
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001570 # ERROR_ACCESS_DENIED (winerror 5) is received when the
1571 # process already died.
Antoine Pitrou23bba4c2012-04-18 20:51:15 +02001572 rc = _winapi.GetExitCodeProcess(self._handle)
1573 if rc == _winapi.STILL_ACTIVE:
Antoine Pitrou1f9a8352012-03-11 19:29:12 +01001574 raise
1575 self.returncode = rc
Christian Heimesa342c012008-04-20 21:01:16 +00001576
1577 kill = terminate
1578
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001579 else:
1580 #
1581 # POSIX methods
1582 #
1583 def _get_handles(self, stdin, stdout, stderr):
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +00001584 """Construct and return tuple with IO objects:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001585 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1586 """
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001587 p2cread, p2cwrite = -1, -1
1588 c2pread, c2pwrite = -1, -1
1589 errread, errwrite = -1, -1
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001590
Peter Astrandd38ddf42005-02-10 08:32:50 +00001591 if stdin is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001592 pass
1593 elif stdin == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001594 p2cread, p2cwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001595 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1596 fcntl.fcntl(p2cwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001597 elif stdin == DEVNULL:
1598 p2cread = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001599 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001600 p2cread = stdin
1601 else:
1602 # Assuming file-like object
1603 p2cread = stdin.fileno()
1604
Peter Astrandd38ddf42005-02-10 08:32:50 +00001605 if stdout is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001606 pass
1607 elif stdout == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001608 c2pread, c2pwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001609 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1610 fcntl.fcntl(c2pwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001611 elif stdout == DEVNULL:
1612 c2pwrite = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001613 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001614 c2pwrite = stdout
1615 else:
1616 # Assuming file-like object
Tim Peterse718f612004-10-12 21:51:32 +00001617 c2pwrite = stdout.fileno()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001618
Peter Astrandd38ddf42005-02-10 08:32:50 +00001619 if stderr is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001620 pass
1621 elif stderr == PIPE:
Victor Stinnerdaf45552013-08-28 00:53:59 +02001622 errread, errwrite = os.pipe()
Ruben Vorderman23c0fb82020-10-20 01:30:02 +02001623 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1624 fcntl.fcntl(errwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001625 elif stderr == STDOUT:
Martin Panterc7635892016-05-13 01:54:44 +00001626 if c2pwrite != -1:
1627 errwrite = c2pwrite
1628 else: # child's stdout is not set, use parent's stdout
1629 errwrite = sys.__stdout__.fileno()
Ross Lagerwallba102ec2011-03-16 18:40:25 +02001630 elif stderr == DEVNULL:
1631 errwrite = self._get_devnull()
Peter Astrandd38ddf42005-02-10 08:32:50 +00001632 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001633 errwrite = stderr
1634 else:
1635 # Assuming file-like object
1636 errwrite = stderr.fileno()
1637
1638 return (p2cread, p2cwrite,
1639 c2pread, c2pwrite,
1640 errread, errwrite)
1641
1642
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001643 def _posix_spawn(self, args, executable, env, restore_signals,
1644 p2cread, p2cwrite,
1645 c2pread, c2pwrite,
1646 errread, errwrite):
Victor Stinner8c349562019-01-16 23:38:06 +01001647 """Execute program using os.posix_spawn()."""
Victor Stinner9daecf32019-01-16 00:02:35 +01001648 if env is None:
1649 env = os.environ
1650
1651 kwargs = {}
1652 if restore_signals:
1653 # See _Py_RestoreSignals() in Python/pylifecycle.c
1654 sigset = []
1655 for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'):
1656 signum = getattr(signal, signame, None)
1657 if signum is not None:
1658 sigset.append(signum)
1659 kwargs['setsigdef'] = sigset
1660
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001661 file_actions = []
1662 for fd in (p2cwrite, c2pread, errread):
1663 if fd != -1:
1664 file_actions.append((os.POSIX_SPAWN_CLOSE, fd))
1665 for fd, fd2 in (
1666 (p2cread, 0),
1667 (c2pwrite, 1),
1668 (errwrite, 2),
1669 ):
1670 if fd != -1:
1671 file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2))
1672 if file_actions:
1673 kwargs['file_actions'] = file_actions
1674
Victor Stinner8c349562019-01-16 23:38:06 +01001675 self.pid = os.posix_spawn(executable, args, env, **kwargs)
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001676 self._child_created = True
1677
1678 self._close_pipe_fds(p2cread, p2cwrite,
1679 c2pread, c2pwrite,
1680 errread, errwrite)
Victor Stinner9daecf32019-01-16 00:02:35 +01001681
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001682 def _execute_child(self, args, executable, preexec_fn, close_fds,
Andrew Svetlov592df202012-08-15 17:36:15 +03001683 pass_fds, cwd, env,
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001684 startupinfo, creationflags, shell,
1685 p2cread, p2cwrite,
1686 c2pread, c2pwrite,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001687 errread, errwrite,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001688 restore_signals,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001689 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001690 start_new_session):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001691 """Execute program (POSIX version)"""
1692
Victor Stinner7b3b20a2011-03-03 12:54:05 +00001693 if isinstance(args, (str, bytes)):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001694 args = [args]
Serhiy Storchaka9e3c4522019-05-28 22:49:35 +03001695 elif isinstance(args, os.PathLike):
1696 if shell:
1697 raise TypeError('path-like args is not allowed when '
1698 'shell is true')
1699 args = [args]
Thomas Wouters89f507f2006-12-13 04:49:30 +00001700 else:
Serhiy Storchakabe50a7b2018-02-28 01:03:46 +02001701 args = list(args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001702
1703 if shell:
Xavier de Gayeb35fc622016-12-13 16:32:21 +01001704 # On Android the default shell is at '/system/bin/sh'.
1705 unix_shell = ('/system/bin/sh' if
1706 hasattr(sys, 'getandroidapilevel') else '/bin/sh')
1707 args = [unix_shell, "-c"] + args
Stefan Krah9542cc62010-07-19 14:20:53 +00001708 if executable:
1709 args[0] = executable
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001710
Peter Astrandd38ddf42005-02-10 08:32:50 +00001711 if executable is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001712 executable = args[0]
Victor Stinner9daecf32019-01-16 00:02:35 +01001713
Steve Dower60419a72019-06-24 08:42:54 -07001714 sys.audit("subprocess.Popen", executable, args, cwd, env)
1715
Victor Stinner9daecf32019-01-16 00:02:35 +01001716 if (_USE_POSIX_SPAWN
Victor Stinner8c349562019-01-16 23:38:06 +01001717 and os.path.dirname(executable)
Victor Stinner9daecf32019-01-16 00:02:35 +01001718 and preexec_fn is None
1719 and not close_fds
1720 and not pass_fds
1721 and cwd is None
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001722 and (p2cread == -1 or p2cread > 2)
1723 and (c2pwrite == -1 or c2pwrite > 2)
1724 and (errwrite == -1 or errwrite > 2)
Victor Stinnerfaca8552019-09-25 15:52:49 +02001725 and not start_new_session
1726 and gid is None
1727 and gids is None
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001728 and uid is None
1729 and umask < 0):
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001730 self._posix_spawn(args, executable, env, restore_signals,
1731 p2cread, p2cwrite,
1732 c2pread, c2pwrite,
1733 errread, errwrite)
Victor Stinner9daecf32019-01-16 00:02:35 +01001734 return
1735
Gregory P. Smith5591b022012-10-10 03:34:47 -07001736 orig_executable = executable
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001737
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001738 # For transferring possible exec failure from child to parent.
1739 # Data format: "exception name:hex errno:description"
1740 # Pickle is not used; it is complex and involves memory allocation.
Victor Stinnerdaf45552013-08-28 00:53:59 +02001741 errpipe_read, errpipe_write = os.pipe()
Gregory P. Smith53dd8162013-12-01 16:03:24 -08001742 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
1743 low_fds_to_close = []
1744 while errpipe_write < 3:
1745 low_fds_to_close.append(errpipe_write)
1746 errpipe_write = os.dup(errpipe_write)
1747 for low_fd in low_fds_to_close:
1748 os.close(low_fd)
Christian Heimesfdab48e2008-01-20 09:06:41 +00001749 try:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001750 try:
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001751 # We must avoid complex work that could involve
1752 # malloc or free in the child process to avoid
1753 # potential deadlocks, thus we do all this here.
1754 # and pass it to fork_exec()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001755
Victor Stinner372b8382011-06-21 17:24:21 +02001756 if env is not None:
Serhiy Storchakad174d242017-06-23 19:39:27 +03001757 env_list = []
1758 for k, v in env.items():
1759 k = os.fsencode(k)
1760 if b'=' in k:
1761 raise ValueError("illegal environment variable name")
1762 env_list.append(k + b'=' + os.fsencode(v))
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001763 else:
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001764 env_list = None # Use execv instead of execve.
1765 executable = os.fsencode(executable)
1766 if os.path.dirname(executable):
1767 executable_list = (executable,)
1768 else:
1769 # This matches the behavior of os._execvpe().
1770 executable_list = tuple(
1771 os.path.join(os.fsencode(dir), executable)
1772 for dir in os.get_exec_path(env))
Gregory P. Smith361e30c2013-12-01 00:12:24 -08001773 fds_to_keep = set(pass_fds)
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001774 fds_to_keep.add(errpipe_write)
1775 self.pid = _posixsubprocess.fork_exec(
1776 args, executable_list,
Serhiy Storchaka66bffd12017-04-19 21:12:46 +03001777 close_fds, tuple(sorted(map(int, fds_to_keep))),
1778 cwd, env_list,
Gregory P. Smith59fd1bf2011-05-28 09:32:39 -07001779 p2cread, p2cwrite, c2pread, c2pwrite,
1780 errread, errwrite,
1781 errpipe_read, errpipe_write,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001782 restore_signals, start_new_session,
Gregory P. Smithf3751ef2019-10-12 13:24:56 -07001783 gid, gids, uid, umask,
Patrick McLean2b2ead72019-09-12 10:15:44 -07001784 preexec_fn)
Charles-François Natali558639f2011-08-18 19:11:29 +02001785 self._child_created = True
Facundo Batista10706e22009-06-19 20:34:30 +00001786 finally:
1787 # be sure the FD is closed no matter what
1788 os.close(errpipe_write)
1789
Victor Stinnerf6243ac2019-01-23 19:00:39 +01001790 self._close_pipe_fds(p2cread, p2cwrite,
1791 c2pread, c2pwrite,
1792 errread, errwrite)
Facundo Batista10706e22009-06-19 20:34:30 +00001793
1794 # Wait for exec to fail or succeed; possibly raising an
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001795 # exception (limited in size)
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001796 errpipe_data = bytearray()
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001797 while True:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001798 part = os.read(errpipe_read, 50000)
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001799 errpipe_data += part
1800 if not part or len(errpipe_data) > 50000:
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001801 break
Facundo Batista10706e22009-06-19 20:34:30 +00001802 finally:
1803 # be sure the FD is closed no matter what
1804 os.close(errpipe_read)
1805
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001806 if errpipe_data:
Gregory P. Smithe85db2b2010-12-14 14:38:00 +00001807 try:
Victor Stinnera58e2c52016-05-20 12:08:12 +02001808 pid, sts = os.waitpid(self.pid, 0)
1809 if pid == self.pid:
1810 self._handle_exitstatus(sts)
1811 else:
1812 self.returncode = sys.maxsize
Victor Stinnera5e881d2015-01-14 17:07:59 +01001813 except ChildProcessError:
1814 pass
Victor Stinnera58e2c52016-05-20 12:08:12 +02001815
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001816 try:
Gregory P. Smithf44c9da2012-11-10 23:33:17 -08001817 exception_name, hex_errno, err_msg = (
1818 errpipe_data.split(b':', 2))
Ammar Askar3fc499b2017-09-06 02:41:30 -04001819 # The encoding here should match the encoding
1820 # written in by the subprocess implementations
1821 # like _posixsubprocess
1822 err_msg = err_msg.decode()
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001823 except ValueError:
Gregory P. Smith8d07c262012-11-10 23:53:47 -08001824 exception_name = b'SubprocessError'
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001825 hex_errno = b'0'
Ammar Askar3fc499b2017-09-06 02:41:30 -04001826 err_msg = 'Bad exception data from child: {!r}'.format(
1827 bytes(errpipe_data))
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001828 child_exception_type = getattr(
1829 builtins, exception_name.decode('ascii'),
Gregory P. Smith8d07c262012-11-10 23:53:47 -08001830 SubprocessError)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001831 if issubclass(child_exception_type, OSError) and hex_errno:
Benjamin Petersonb8bc4392010-11-20 18:24:54 +00001832 errno_num = int(hex_errno, 16)
Gregory P. Smith5591b022012-10-10 03:34:47 -07001833 child_exec_never_called = (err_msg == "noexec")
1834 if child_exec_never_called:
1835 err_msg = ""
Gregory P. Smith8621bb52017-08-24 14:58:25 -07001836 # The error must be from chdir(cwd).
1837 err_filename = cwd
1838 else:
1839 err_filename = orig_executable
Benjamin Petersonb8bc4392010-11-20 18:24:54 +00001840 if errno_num != 0:
1841 err_msg = os.strerror(errno_num)
Gregory P. Smith8621bb52017-08-24 14:58:25 -07001842 raise child_exception_type(errno_num, err_msg, err_filename)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001843 raise child_exception_type(err_msg)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001844
1845
Victor Stinner65a796e2020-04-01 18:49:29 +02001846 def _handle_exitstatus(self, sts,
1847 waitstatus_to_exitcode=os.waitstatus_to_exitcode,
1848 _WIFSTOPPED=os.WIFSTOPPED,
1849 _WSTOPSIG=os.WSTOPSIG):
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001850 """All callers to this function MUST hold self._waitpid_lock."""
Brett Cannon84df1e62010-05-14 00:33:40 +00001851 # This method is called (indirectly) by __del__, so it cannot
Serhiy Storchaka72e77612014-02-10 19:20:22 +02001852 # refer to anything outside of its local scope.
Victor Stinner65a796e2020-04-01 18:49:29 +02001853 if _WIFSTOPPED(sts):
Gregory P. Smith50e16e32017-01-22 17:28:38 -08001854 self.returncode = -_WSTOPSIG(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001855 else:
Victor Stinner65a796e2020-04-01 18:49:29 +02001856 self.returncode = waitstatus_to_exitcode(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001857
Brett Cannon84df1e62010-05-14 00:33:40 +00001858 def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid,
Andrew Svetlov1d960fe2012-12-24 20:08:53 +02001859 _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001860 """Check if child process has terminated. Returns returncode
Brett Cannon84df1e62010-05-14 00:33:40 +00001861 attribute.
1862
1863 This method is called by __del__, so it cannot reference anything
1864 outside of the local scope (nor can any methods it calls).
1865
1866 """
Peter Astrandd38ddf42005-02-10 08:32:50 +00001867 if self.returncode is None:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001868 if not self._waitpid_lock.acquire(False):
1869 # Something else is busy calling waitpid. Don't allow two
1870 # at once. We know nothing yet.
1871 return None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001872 try:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001873 if self.returncode is not None:
1874 return self.returncode # Another thread waited.
Brett Cannon84df1e62010-05-14 00:33:40 +00001875 pid, sts = _waitpid(self.pid, _WNOHANG)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001876 if pid == self.pid:
1877 self._handle_exitstatus(sts)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +02001878 except OSError as e:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001879 if _deadstate is not None:
1880 self.returncode = _deadstate
Andrew Svetlov08bab072012-12-24 20:06:35 +02001881 elif e.errno == _ECHILD:
Gregory P. Smith39051712012-09-29 11:40:38 -07001882 # This happens if SIGCLD is set to be ignored or
1883 # waiting for child processes has otherwise been
1884 # disabled for our process. This child is dead, we
1885 # can't get the status.
1886 # http://bugs.python.org/issue15756
1887 self.returncode = 0
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001888 finally:
1889 self._waitpid_lock.release()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001890 return self.returncode
1891
1892
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001893 def _try_wait(self, wait_flags):
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001894 """All callers to this function MUST hold self._waitpid_lock."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001895 try:
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00001896 (pid, sts) = os.waitpid(self.pid, wait_flags)
Victor Stinnera5e881d2015-01-14 17:07:59 +01001897 except ChildProcessError:
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001898 # This happens if SIGCLD is set to be ignored or waiting
1899 # for child processes has otherwise been disabled for our
1900 # process. This child is dead, we can't get the status.
1901 pid = self.pid
1902 sts = 0
1903 return (pid, sts)
1904
1905
Gregory P. Smithf4d644f2018-01-29 21:27:39 -08001906 def _wait(self, timeout):
1907 """Internal implementation of wait() on POSIX."""
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001908 if self.returncode is not None:
1909 return self.returncode
Reid Kleckner2b228f02011-03-16 16:57:54 -04001910
Gregory P. Smith82604e02016-11-20 16:31:07 -08001911 if timeout is not None:
1912 endtime = _time() + timeout
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001913 # Enter a busy loop if we have a timeout. This busy loop was
1914 # cribbed from Lib/threading.py in Thread.wait() at r71065.
1915 delay = 0.0005 # 500 us -> initial delay of 1 ms
1916 while True:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001917 if self._waitpid_lock.acquire(False):
1918 try:
1919 if self.returncode is not None:
1920 break # Another thread waited.
1921 (pid, sts) = self._try_wait(os.WNOHANG)
1922 assert pid == self.pid or pid == 0
1923 if pid == self.pid:
1924 self._handle_exitstatus(sts)
1925 break
1926 finally:
1927 self._waitpid_lock.release()
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001928 remaining = self._remaining_time(endtime)
1929 if remaining <= 0:
Reid Kleckner2b228f02011-03-16 16:57:54 -04001930 raise TimeoutExpired(self.args, timeout)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001931 delay = min(delay * 2, remaining, .05)
1932 time.sleep(delay)
Gregory P. Smithf328d792012-11-10 21:06:18 -08001933 else:
1934 while self.returncode is None:
Gregory P. Smithd65ba512014-04-23 00:27:17 -07001935 with self._waitpid_lock:
1936 if self.returncode is not None:
1937 break # Another thread waited.
1938 (pid, sts) = self._try_wait(0)
1939 # Check the pid and loop as waitpid has been known to
1940 # return 0 even without WNOHANG in odd situations.
1941 # http://bugs.python.org/issue14396.
1942 if pid == self.pid:
1943 self._handle_exitstatus(sts)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001944 return self.returncode
1945
1946
Reid Kleckner2b228f02011-03-16 16:57:54 -04001947 def _communicate(self, input, endtime, orig_timeout):
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04001948 if self.stdin and not self._communication_started:
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001949 # Flush stdio buffer. This might block, if the user has
1950 # been writing to .stdin in an uncontrolled fashion.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001951 try:
1952 self.stdin.flush()
1953 except BrokenPipeError:
1954 pass # communicate() must ignore BrokenPipeError.
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001955 if not input:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)1ef8c7e2016-06-04 00:22:17 +00001956 try:
1957 self.stdin.close()
1958 except BrokenPipeError:
1959 pass # communicate() must ignore BrokenPipeError.
Gregory P. Smithd06fa472009-07-04 02:46:54 +00001960
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001961 stdout = None
1962 stderr = None
1963
1964 # Only create this mapping if we haven't already.
1965 if not self._communication_started:
1966 self._fileobj2output = {}
1967 if self.stdout:
1968 self._fileobj2output[self.stdout] = []
1969 if self.stderr:
1970 self._fileobj2output[self.stderr] = []
1971
1972 if self.stdout:
1973 stdout = self._fileobj2output[self.stdout]
1974 if self.stderr:
1975 stderr = self._fileobj2output[self.stderr]
1976
1977 self._save_input(input)
1978
Gregory P. Smith5ca129b2013-12-07 19:14:59 -08001979 if self._input:
1980 input_view = memoryview(self._input)
1981
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001982 with _PopenSelector() as selector:
1983 if self.stdin and input:
1984 selector.register(self.stdin, selectors.EVENT_WRITE)
Alex Rebertd3ae95e2020-01-22 18:28:31 -05001985 if self.stdout and not self.stdout.closed:
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001986 selector.register(self.stdout, selectors.EVENT_READ)
Alex Rebertd3ae95e2020-01-22 18:28:31 -05001987 if self.stderr and not self.stderr.closed:
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001988 selector.register(self.stderr, selectors.EVENT_READ)
1989
1990 while selector.get_map():
1991 timeout = self._remaining_time(endtime)
1992 if timeout is not None and timeout < 0:
Gregory P. Smith580d2782019-09-11 04:23:05 -05001993 self._check_timeout(endtime, orig_timeout,
1994 stdout, stderr,
1995 skip_check_and_raise=True)
1996 raise RuntimeError( # Impossible :)
1997 '_check_timeout(..., skip_check_and_raise=True) '
1998 'failed to raise TimeoutExpired.')
Charles-François Natali3a4586a2013-11-08 19:56:59 +01001999
2000 ready = selector.select(timeout)
Gregory P. Smith580d2782019-09-11 04:23:05 -05002001 self._check_timeout(endtime, orig_timeout, stdout, stderr)
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002002
2003 # XXX Rewrite these to use non-blocking I/O on the file
2004 # objects; they are no longer using C stdio!
2005
2006 for key, events in ready:
2007 if key.fileobj is self.stdin:
Gregory P. Smith5ca129b2013-12-07 19:14:59 -08002008 chunk = input_view[self._input_offset :
2009 self._input_offset + _PIPE_BUF]
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002010 try:
2011 self._input_offset += os.write(key.fd, chunk)
Victor Stinnera5e881d2015-01-14 17:07:59 +01002012 except BrokenPipeError:
2013 selector.unregister(key.fileobj)
2014 key.fileobj.close()
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002015 else:
2016 if self._input_offset >= len(self._input):
2017 selector.unregister(key.fileobj)
2018 key.fileobj.close()
2019 elif key.fileobj in (self.stdout, self.stderr):
Gregory P. Smith7b83b182013-12-08 10:58:28 -08002020 data = os.read(key.fd, 32768)
Charles-François Natali3a4586a2013-11-08 19:56:59 +01002021 if not data:
2022 selector.unregister(key.fileobj)
2023 key.fileobj.close()
2024 self._fileobj2output[key.fileobj].append(data)
Reid Kleckner31aa7dd2011-03-14 12:02:10 -04002025
2026 self.wait(timeout=self._remaining_time(endtime))
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002027
2028 # All data exchanged. Translate lists into strings.
2029 if stdout is not None:
2030 stdout = b''.join(stdout)
2031 if stderr is not None:
2032 stderr = b''.join(stderr)
2033
2034 # Translate newlines, if requested.
2035 # This also turns bytes into strings.
andyclegg7fed7bd2017-10-23 03:01:19 +01002036 if self.text_mode:
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002037 if stdout is not None:
2038 stdout = self._translate_newlines(stdout,
Steve Dower050acae2016-09-06 20:16:17 -07002039 self.stdout.encoding,
2040 self.stdout.errors)
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002041 if stderr is not None:
2042 stderr = self._translate_newlines(stderr,
Steve Dower050acae2016-09-06 20:16:17 -07002043 self.stderr.encoding,
2044 self.stderr.errors)
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002045
Gregory P. Smithd06fa472009-07-04 02:46:54 +00002046 return (stdout, stderr)
2047
2048
Andrew Svetlovaa0dbdc2012-08-14 18:40:21 +03002049 def _save_input(self, input):
2050 # This method is called from the _communicate_with_*() methods
2051 # so that if we time out while communicating, we can continue
2052 # sending input if we retry.
2053 if self.stdin and self._input is None:
2054 self._input_offset = 0
2055 self._input = input
andyclegg7fed7bd2017-10-23 03:01:19 +01002056 if input is not None and self.text_mode:
Steve Dower050acae2016-09-06 20:16:17 -07002057 self._input = self._input.encode(self.stdin.encoding,
2058 self.stdin.errors)
Andrew Svetlovaa0dbdc2012-08-14 18:40:21 +03002059
2060
Christian Heimesa342c012008-04-20 21:01:16 +00002061 def send_signal(self, sig):
Gregory P. Smitha0c9caa2015-11-15 18:19:10 -08002062 """Send a signal to the process."""
Victor Stinnere85a3052020-01-15 17:38:55 +01002063 # bpo-38630: Polling reduces the risk of sending a signal to the
2064 # wrong process if the process completed, the Popen.returncode
2065 # attribute is still None, and the pid has been reassigned
2066 # (recycled) to a new different process. This race condition can
2067 # happens in two cases.
2068 #
2069 # Case 1. Thread A calls Popen.poll(), thread B calls
2070 # Popen.send_signal(). In thread A, waitpid() succeed and returns
2071 # the exit status. Thread B calls kill() because poll() in thread A
2072 # did not set returncode yet. Calling poll() in thread B prevents
2073 # the race condition thanks to Popen._waitpid_lock.
2074 #
2075 # Case 2. waitpid(pid, 0) has been called directly, without
2076 # using Popen methods: returncode is still None is this case.
2077 # Calling Popen.poll() will set returncode to a default value,
2078 # since waitpid() fails with ProcessLookupError.
2079 self.poll()
2080 if self.returncode is not None:
2081 # Skip signalling a process that we know has already died.
2082 return
2083
2084 # The race condition can still happen if the race condition
2085 # described above happens between the returncode test
2086 # and the kill() call.
Filipe Laíns01a202a2020-11-21 09:22:08 +00002087 try:
2088 os.kill(self.pid, sig)
2089 except ProcessLookupError:
2090 # Supress the race condition error; bpo-40550.
2091 pass
Christian Heimesa342c012008-04-20 21:01:16 +00002092
2093 def terminate(self):
2094 """Terminate the process with SIGTERM
2095 """
2096 self.send_signal(signal.SIGTERM)
2097
2098 def kill(self):
2099 """Kill the process with SIGKILL
2100 """
2101 self.send_signal(signal.SIGKILL)