1*cda5da8dSAndroid Build Coastguard Worker# subprocess - Subprocesses with accessible I/O streams 2*cda5da8dSAndroid Build Coastguard Worker# 3*cda5da8dSAndroid Build Coastguard Worker# For more information about this module, see PEP 324. 4*cda5da8dSAndroid Build Coastguard Worker# 5*cda5da8dSAndroid Build Coastguard Worker# Copyright (c) 2003-2005 by Peter Astrand <[email protected]> 6*cda5da8dSAndroid Build Coastguard Worker# 7*cda5da8dSAndroid Build Coastguard Worker# Licensed to PSF under a Contributor Agreement. 8*cda5da8dSAndroid Build Coastguard Worker 9*cda5da8dSAndroid Build Coastguard Workerr"""Subprocesses with accessible I/O streams 10*cda5da8dSAndroid Build Coastguard Worker 11*cda5da8dSAndroid Build Coastguard WorkerThis module allows you to spawn processes, connect to their 12*cda5da8dSAndroid Build Coastguard Workerinput/output/error pipes, and obtain their return codes. 13*cda5da8dSAndroid Build Coastguard Worker 14*cda5da8dSAndroid Build Coastguard WorkerFor a complete description of this module see the Python documentation. 15*cda5da8dSAndroid Build Coastguard Worker 16*cda5da8dSAndroid Build Coastguard WorkerMain API 17*cda5da8dSAndroid Build Coastguard Worker======== 18*cda5da8dSAndroid Build Coastguard Workerrun(...): Runs a command, waits for it to complete, then returns a 19*cda5da8dSAndroid Build Coastguard Worker CompletedProcess instance. 20*cda5da8dSAndroid Build Coastguard WorkerPopen(...): A class for flexibly executing a command in a new process 21*cda5da8dSAndroid Build Coastguard Worker 22*cda5da8dSAndroid Build Coastguard WorkerConstants 23*cda5da8dSAndroid Build Coastguard Worker--------- 24*cda5da8dSAndroid Build Coastguard WorkerDEVNULL: Special value that indicates that os.devnull should be used 25*cda5da8dSAndroid Build Coastguard WorkerPIPE: Special value that indicates a pipe should be created 26*cda5da8dSAndroid Build Coastguard WorkerSTDOUT: Special value that indicates that stderr should go to stdout 27*cda5da8dSAndroid Build Coastguard Worker 28*cda5da8dSAndroid Build Coastguard Worker 29*cda5da8dSAndroid Build Coastguard WorkerOlder API 30*cda5da8dSAndroid Build Coastguard Worker========= 31*cda5da8dSAndroid Build Coastguard Workercall(...): Runs a command, waits for it to complete, then returns 32*cda5da8dSAndroid Build Coastguard Worker the return code. 33*cda5da8dSAndroid Build Coastguard Workercheck_call(...): Same as call() but raises CalledProcessError() 34*cda5da8dSAndroid Build Coastguard Worker if return code is not 0 35*cda5da8dSAndroid Build Coastguard Workercheck_output(...): Same as check_call() but returns the contents of 36*cda5da8dSAndroid Build Coastguard Worker stdout instead of a return code 37*cda5da8dSAndroid Build Coastguard Workergetoutput(...): Runs a command in the shell, waits for it to complete, 38*cda5da8dSAndroid Build Coastguard Worker then returns the output 39*cda5da8dSAndroid Build Coastguard Workergetstatusoutput(...): Runs a command in the shell, waits for it to complete, 40*cda5da8dSAndroid Build Coastguard Worker then returns a (exitcode, output) tuple 41*cda5da8dSAndroid Build Coastguard Worker""" 42*cda5da8dSAndroid Build Coastguard Worker 43*cda5da8dSAndroid Build Coastguard Workerimport builtins 44*cda5da8dSAndroid Build Coastguard Workerimport errno 45*cda5da8dSAndroid Build Coastguard Workerimport io 46*cda5da8dSAndroid Build Coastguard Workerimport locale 47*cda5da8dSAndroid Build Coastguard Workerimport os 48*cda5da8dSAndroid Build Coastguard Workerimport time 49*cda5da8dSAndroid Build Coastguard Workerimport signal 50*cda5da8dSAndroid Build Coastguard Workerimport sys 51*cda5da8dSAndroid Build Coastguard Workerimport threading 52*cda5da8dSAndroid Build Coastguard Workerimport warnings 53*cda5da8dSAndroid Build Coastguard Workerimport contextlib 54*cda5da8dSAndroid Build Coastguard Workerfrom time import monotonic as _time 55*cda5da8dSAndroid Build Coastguard Workerimport types 56*cda5da8dSAndroid Build Coastguard Worker 57*cda5da8dSAndroid Build Coastguard Workertry: 58*cda5da8dSAndroid Build Coastguard Worker import fcntl 59*cda5da8dSAndroid Build Coastguard Workerexcept ImportError: 60*cda5da8dSAndroid Build Coastguard Worker fcntl = None 61*cda5da8dSAndroid Build Coastguard Worker 62*cda5da8dSAndroid Build Coastguard Worker 63*cda5da8dSAndroid Build Coastguard Worker__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput", 64*cda5da8dSAndroid Build Coastguard Worker "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL", 65*cda5da8dSAndroid Build Coastguard Worker "SubprocessError", "TimeoutExpired", "CompletedProcess"] 66*cda5da8dSAndroid Build Coastguard Worker # NOTE: We intentionally exclude list2cmdline as it is 67*cda5da8dSAndroid Build Coastguard Worker # considered an internal implementation detail. issue10838. 68*cda5da8dSAndroid Build Coastguard Worker 69*cda5da8dSAndroid Build Coastguard Worker# use presence of msvcrt to detect Windows-like platforms (see bpo-8110) 70*cda5da8dSAndroid Build Coastguard Workertry: 71*cda5da8dSAndroid Build Coastguard Worker import msvcrt 72*cda5da8dSAndroid Build Coastguard Workerexcept ModuleNotFoundError: 73*cda5da8dSAndroid Build Coastguard Worker _mswindows = False 74*cda5da8dSAndroid Build Coastguard Workerelse: 75*cda5da8dSAndroid Build Coastguard Worker _mswindows = True 76*cda5da8dSAndroid Build Coastguard Worker 77*cda5da8dSAndroid Build Coastguard Worker# wasm32-emscripten and wasm32-wasi do not support processes 78*cda5da8dSAndroid Build Coastguard Worker_can_fork_exec = sys.platform not in {"emscripten", "wasi"} 79*cda5da8dSAndroid Build Coastguard Worker 80*cda5da8dSAndroid Build Coastguard Workerif _mswindows: 81*cda5da8dSAndroid Build Coastguard Worker import _winapi 82*cda5da8dSAndroid Build Coastguard Worker from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, 83*cda5da8dSAndroid Build Coastguard Worker STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, 84*cda5da8dSAndroid Build Coastguard Worker STD_ERROR_HANDLE, SW_HIDE, 85*cda5da8dSAndroid Build Coastguard Worker STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW, 86*cda5da8dSAndroid Build Coastguard Worker ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, 87*cda5da8dSAndroid Build Coastguard Worker HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS, 88*cda5da8dSAndroid Build Coastguard Worker NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS, 89*cda5da8dSAndroid Build Coastguard Worker CREATE_NO_WINDOW, DETACHED_PROCESS, 90*cda5da8dSAndroid Build Coastguard Worker CREATE_DEFAULT_ERROR_MODE, CREATE_BREAKAWAY_FROM_JOB) 91*cda5da8dSAndroid Build Coastguard Worker 92*cda5da8dSAndroid Build Coastguard Worker __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP", 93*cda5da8dSAndroid Build Coastguard Worker "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE", 94*cda5da8dSAndroid Build Coastguard Worker "STD_ERROR_HANDLE", "SW_HIDE", 95*cda5da8dSAndroid Build Coastguard Worker "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW", 96*cda5da8dSAndroid Build Coastguard Worker "STARTUPINFO", 97*cda5da8dSAndroid Build Coastguard Worker "ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS", 98*cda5da8dSAndroid Build Coastguard Worker "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS", 99*cda5da8dSAndroid Build Coastguard Worker "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS", 100*cda5da8dSAndroid Build Coastguard Worker "CREATE_NO_WINDOW", "DETACHED_PROCESS", 101*cda5da8dSAndroid Build Coastguard Worker "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"]) 102*cda5da8dSAndroid Build Coastguard Workerelse: 103*cda5da8dSAndroid Build Coastguard Worker if _can_fork_exec: 104*cda5da8dSAndroid Build Coastguard Worker from _posixsubprocess import fork_exec as _fork_exec 105*cda5da8dSAndroid Build Coastguard Worker # used in methods that are called by __del__ 106*cda5da8dSAndroid Build Coastguard Worker _waitpid = os.waitpid 107*cda5da8dSAndroid Build Coastguard Worker _waitstatus_to_exitcode = os.waitstatus_to_exitcode 108*cda5da8dSAndroid Build Coastguard Worker _WIFSTOPPED = os.WIFSTOPPED 109*cda5da8dSAndroid Build Coastguard Worker _WSTOPSIG = os.WSTOPSIG 110*cda5da8dSAndroid Build Coastguard Worker _WNOHANG = os.WNOHANG 111*cda5da8dSAndroid Build Coastguard Worker else: 112*cda5da8dSAndroid Build Coastguard Worker _fork_exec = None 113*cda5da8dSAndroid Build Coastguard Worker _waitpid = None 114*cda5da8dSAndroid Build Coastguard Worker _waitstatus_to_exitcode = None 115*cda5da8dSAndroid Build Coastguard Worker _WIFSTOPPED = None 116*cda5da8dSAndroid Build Coastguard Worker _WSTOPSIG = None 117*cda5da8dSAndroid Build Coastguard Worker _WNOHANG = None 118*cda5da8dSAndroid Build Coastguard Worker import select 119*cda5da8dSAndroid Build Coastguard Worker import selectors 120*cda5da8dSAndroid Build Coastguard Worker 121*cda5da8dSAndroid Build Coastguard Worker 122*cda5da8dSAndroid Build Coastguard Worker# Exception classes used by this module. 123*cda5da8dSAndroid Build Coastguard Workerclass SubprocessError(Exception): pass 124*cda5da8dSAndroid Build Coastguard Worker 125*cda5da8dSAndroid Build Coastguard Worker 126*cda5da8dSAndroid Build Coastguard Workerclass CalledProcessError(SubprocessError): 127*cda5da8dSAndroid Build Coastguard Worker """Raised when run() is called with check=True and the process 128*cda5da8dSAndroid Build Coastguard Worker returns a non-zero exit status. 129*cda5da8dSAndroid Build Coastguard Worker 130*cda5da8dSAndroid Build Coastguard Worker Attributes: 131*cda5da8dSAndroid Build Coastguard Worker cmd, returncode, stdout, stderr, output 132*cda5da8dSAndroid Build Coastguard Worker """ 133*cda5da8dSAndroid Build Coastguard Worker def __init__(self, returncode, cmd, output=None, stderr=None): 134*cda5da8dSAndroid Build Coastguard Worker self.returncode = returncode 135*cda5da8dSAndroid Build Coastguard Worker self.cmd = cmd 136*cda5da8dSAndroid Build Coastguard Worker self.output = output 137*cda5da8dSAndroid Build Coastguard Worker self.stderr = stderr 138*cda5da8dSAndroid Build Coastguard Worker 139*cda5da8dSAndroid Build Coastguard Worker def __str__(self): 140*cda5da8dSAndroid Build Coastguard Worker if self.returncode and self.returncode < 0: 141*cda5da8dSAndroid Build Coastguard Worker try: 142*cda5da8dSAndroid Build Coastguard Worker return "Command '%s' died with %r." % ( 143*cda5da8dSAndroid Build Coastguard Worker self.cmd, signal.Signals(-self.returncode)) 144*cda5da8dSAndroid Build Coastguard Worker except ValueError: 145*cda5da8dSAndroid Build Coastguard Worker return "Command '%s' died with unknown signal %d." % ( 146*cda5da8dSAndroid Build Coastguard Worker self.cmd, -self.returncode) 147*cda5da8dSAndroid Build Coastguard Worker else: 148*cda5da8dSAndroid Build Coastguard Worker return "Command '%s' returned non-zero exit status %d." % ( 149*cda5da8dSAndroid Build Coastguard Worker self.cmd, self.returncode) 150*cda5da8dSAndroid Build Coastguard Worker 151*cda5da8dSAndroid Build Coastguard Worker @property 152*cda5da8dSAndroid Build Coastguard Worker def stdout(self): 153*cda5da8dSAndroid Build Coastguard Worker """Alias for output attribute, to match stderr""" 154*cda5da8dSAndroid Build Coastguard Worker return self.output 155*cda5da8dSAndroid Build Coastguard Worker 156*cda5da8dSAndroid Build Coastguard Worker @stdout.setter 157*cda5da8dSAndroid Build Coastguard Worker def stdout(self, value): 158*cda5da8dSAndroid Build Coastguard Worker # There's no obvious reason to set this, but allow it anyway so 159*cda5da8dSAndroid Build Coastguard Worker # .stdout is a transparent alias for .output 160*cda5da8dSAndroid Build Coastguard Worker self.output = value 161*cda5da8dSAndroid Build Coastguard Worker 162*cda5da8dSAndroid Build Coastguard Worker 163*cda5da8dSAndroid Build Coastguard Workerclass TimeoutExpired(SubprocessError): 164*cda5da8dSAndroid Build Coastguard Worker """This exception is raised when the timeout expires while waiting for a 165*cda5da8dSAndroid Build Coastguard Worker child process. 166*cda5da8dSAndroid Build Coastguard Worker 167*cda5da8dSAndroid Build Coastguard Worker Attributes: 168*cda5da8dSAndroid Build Coastguard Worker cmd, output, stdout, stderr, timeout 169*cda5da8dSAndroid Build Coastguard Worker """ 170*cda5da8dSAndroid Build Coastguard Worker def __init__(self, cmd, timeout, output=None, stderr=None): 171*cda5da8dSAndroid Build Coastguard Worker self.cmd = cmd 172*cda5da8dSAndroid Build Coastguard Worker self.timeout = timeout 173*cda5da8dSAndroid Build Coastguard Worker self.output = output 174*cda5da8dSAndroid Build Coastguard Worker self.stderr = stderr 175*cda5da8dSAndroid Build Coastguard Worker 176*cda5da8dSAndroid Build Coastguard Worker def __str__(self): 177*cda5da8dSAndroid Build Coastguard Worker return ("Command '%s' timed out after %s seconds" % 178*cda5da8dSAndroid Build Coastguard Worker (self.cmd, self.timeout)) 179*cda5da8dSAndroid Build Coastguard Worker 180*cda5da8dSAndroid Build Coastguard Worker @property 181*cda5da8dSAndroid Build Coastguard Worker def stdout(self): 182*cda5da8dSAndroid Build Coastguard Worker return self.output 183*cda5da8dSAndroid Build Coastguard Worker 184*cda5da8dSAndroid Build Coastguard Worker @stdout.setter 185*cda5da8dSAndroid Build Coastguard Worker def stdout(self, value): 186*cda5da8dSAndroid Build Coastguard Worker # There's no obvious reason to set this, but allow it anyway so 187*cda5da8dSAndroid Build Coastguard Worker # .stdout is a transparent alias for .output 188*cda5da8dSAndroid Build Coastguard Worker self.output = value 189*cda5da8dSAndroid Build Coastguard Worker 190*cda5da8dSAndroid Build Coastguard Worker 191*cda5da8dSAndroid Build Coastguard Workerif _mswindows: 192*cda5da8dSAndroid Build Coastguard Worker class STARTUPINFO: 193*cda5da8dSAndroid Build Coastguard Worker def __init__(self, *, dwFlags=0, hStdInput=None, hStdOutput=None, 194*cda5da8dSAndroid Build Coastguard Worker hStdError=None, wShowWindow=0, lpAttributeList=None): 195*cda5da8dSAndroid Build Coastguard Worker self.dwFlags = dwFlags 196*cda5da8dSAndroid Build Coastguard Worker self.hStdInput = hStdInput 197*cda5da8dSAndroid Build Coastguard Worker self.hStdOutput = hStdOutput 198*cda5da8dSAndroid Build Coastguard Worker self.hStdError = hStdError 199*cda5da8dSAndroid Build Coastguard Worker self.wShowWindow = wShowWindow 200*cda5da8dSAndroid Build Coastguard Worker self.lpAttributeList = lpAttributeList or {"handle_list": []} 201*cda5da8dSAndroid Build Coastguard Worker 202*cda5da8dSAndroid Build Coastguard Worker def copy(self): 203*cda5da8dSAndroid Build Coastguard Worker attr_list = self.lpAttributeList.copy() 204*cda5da8dSAndroid Build Coastguard Worker if 'handle_list' in attr_list: 205*cda5da8dSAndroid Build Coastguard Worker attr_list['handle_list'] = list(attr_list['handle_list']) 206*cda5da8dSAndroid Build Coastguard Worker 207*cda5da8dSAndroid Build Coastguard Worker return STARTUPINFO(dwFlags=self.dwFlags, 208*cda5da8dSAndroid Build Coastguard Worker hStdInput=self.hStdInput, 209*cda5da8dSAndroid Build Coastguard Worker hStdOutput=self.hStdOutput, 210*cda5da8dSAndroid Build Coastguard Worker hStdError=self.hStdError, 211*cda5da8dSAndroid Build Coastguard Worker wShowWindow=self.wShowWindow, 212*cda5da8dSAndroid Build Coastguard Worker lpAttributeList=attr_list) 213*cda5da8dSAndroid Build Coastguard Worker 214*cda5da8dSAndroid Build Coastguard Worker 215*cda5da8dSAndroid Build Coastguard Worker class Handle(int): 216*cda5da8dSAndroid Build Coastguard Worker closed = False 217*cda5da8dSAndroid Build Coastguard Worker 218*cda5da8dSAndroid Build Coastguard Worker def Close(self, CloseHandle=_winapi.CloseHandle): 219*cda5da8dSAndroid Build Coastguard Worker if not self.closed: 220*cda5da8dSAndroid Build Coastguard Worker self.closed = True 221*cda5da8dSAndroid Build Coastguard Worker CloseHandle(self) 222*cda5da8dSAndroid Build Coastguard Worker 223*cda5da8dSAndroid Build Coastguard Worker def Detach(self): 224*cda5da8dSAndroid Build Coastguard Worker if not self.closed: 225*cda5da8dSAndroid Build Coastguard Worker self.closed = True 226*cda5da8dSAndroid Build Coastguard Worker return int(self) 227*cda5da8dSAndroid Build Coastguard Worker raise ValueError("already closed") 228*cda5da8dSAndroid Build Coastguard Worker 229*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 230*cda5da8dSAndroid Build Coastguard Worker return "%s(%d)" % (self.__class__.__name__, int(self)) 231*cda5da8dSAndroid Build Coastguard Worker 232*cda5da8dSAndroid Build Coastguard Worker __del__ = Close 233*cda5da8dSAndroid Build Coastguard Workerelse: 234*cda5da8dSAndroid Build Coastguard Worker # When select or poll has indicated that the file is writable, 235*cda5da8dSAndroid Build Coastguard Worker # we can write up to _PIPE_BUF bytes without risk of blocking. 236*cda5da8dSAndroid Build Coastguard Worker # POSIX defines PIPE_BUF as >= 512. 237*cda5da8dSAndroid Build Coastguard Worker _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) 238*cda5da8dSAndroid Build Coastguard Worker 239*cda5da8dSAndroid Build Coastguard Worker # poll/select have the advantage of not requiring any extra file 240*cda5da8dSAndroid Build Coastguard Worker # descriptor, contrarily to epoll/kqueue (also, they require a single 241*cda5da8dSAndroid Build Coastguard Worker # syscall). 242*cda5da8dSAndroid Build Coastguard Worker if hasattr(selectors, 'PollSelector'): 243*cda5da8dSAndroid Build Coastguard Worker _PopenSelector = selectors.PollSelector 244*cda5da8dSAndroid Build Coastguard Worker else: 245*cda5da8dSAndroid Build Coastguard Worker _PopenSelector = selectors.SelectSelector 246*cda5da8dSAndroid Build Coastguard Worker 247*cda5da8dSAndroid Build Coastguard Worker 248*cda5da8dSAndroid Build Coastguard Workerif _mswindows: 249*cda5da8dSAndroid Build Coastguard Worker # On Windows we just need to close `Popen._handle` when we no longer need 250*cda5da8dSAndroid Build Coastguard Worker # it, so that the kernel can free it. `Popen._handle` gets closed 251*cda5da8dSAndroid Build Coastguard Worker # implicitly when the `Popen` instance is finalized (see `Handle.__del__`, 252*cda5da8dSAndroid Build Coastguard Worker # which is calling `CloseHandle` as requested in [1]), so there is nothing 253*cda5da8dSAndroid Build Coastguard Worker # for `_cleanup` to do. 254*cda5da8dSAndroid Build Coastguard Worker # 255*cda5da8dSAndroid Build Coastguard Worker # [1] https://docs.microsoft.com/en-us/windows/desktop/ProcThread/ 256*cda5da8dSAndroid Build Coastguard Worker # creating-processes 257*cda5da8dSAndroid Build Coastguard Worker _active = None 258*cda5da8dSAndroid Build Coastguard Worker 259*cda5da8dSAndroid Build Coastguard Worker def _cleanup(): 260*cda5da8dSAndroid Build Coastguard Worker pass 261*cda5da8dSAndroid Build Coastguard Workerelse: 262*cda5da8dSAndroid Build Coastguard Worker # This lists holds Popen instances for which the underlying process had not 263*cda5da8dSAndroid Build Coastguard Worker # exited at the time its __del__ method got called: those processes are 264*cda5da8dSAndroid Build Coastguard Worker # wait()ed for synchronously from _cleanup() when a new Popen object is 265*cda5da8dSAndroid Build Coastguard Worker # created, to avoid zombie processes. 266*cda5da8dSAndroid Build Coastguard Worker _active = [] 267*cda5da8dSAndroid Build Coastguard Worker 268*cda5da8dSAndroid Build Coastguard Worker def _cleanup(): 269*cda5da8dSAndroid Build Coastguard Worker if _active is None: 270*cda5da8dSAndroid Build Coastguard Worker return 271*cda5da8dSAndroid Build Coastguard Worker for inst in _active[:]: 272*cda5da8dSAndroid Build Coastguard Worker res = inst._internal_poll(_deadstate=sys.maxsize) 273*cda5da8dSAndroid Build Coastguard Worker if res is not None: 274*cda5da8dSAndroid Build Coastguard Worker try: 275*cda5da8dSAndroid Build Coastguard Worker _active.remove(inst) 276*cda5da8dSAndroid Build Coastguard Worker except ValueError: 277*cda5da8dSAndroid Build Coastguard Worker # This can happen if two threads create a new Popen instance. 278*cda5da8dSAndroid Build Coastguard Worker # It's harmless that it was already removed, so ignore. 279*cda5da8dSAndroid Build Coastguard Worker pass 280*cda5da8dSAndroid Build Coastguard Worker 281*cda5da8dSAndroid Build Coastguard WorkerPIPE = -1 282*cda5da8dSAndroid Build Coastguard WorkerSTDOUT = -2 283*cda5da8dSAndroid Build Coastguard WorkerDEVNULL = -3 284*cda5da8dSAndroid Build Coastguard Worker 285*cda5da8dSAndroid Build Coastguard Worker 286*cda5da8dSAndroid Build Coastguard Worker# XXX This function is only used by multiprocessing and the test suite, 287*cda5da8dSAndroid Build Coastguard Worker# but it's here so that it can be imported when Python is compiled without 288*cda5da8dSAndroid Build Coastguard Worker# threads. 289*cda5da8dSAndroid Build Coastguard Worker 290*cda5da8dSAndroid Build Coastguard Workerdef _optim_args_from_interpreter_flags(): 291*cda5da8dSAndroid Build Coastguard Worker """Return a list of command-line arguments reproducing the current 292*cda5da8dSAndroid Build Coastguard Worker optimization settings in sys.flags.""" 293*cda5da8dSAndroid Build Coastguard Worker args = [] 294*cda5da8dSAndroid Build Coastguard Worker value = sys.flags.optimize 295*cda5da8dSAndroid Build Coastguard Worker if value > 0: 296*cda5da8dSAndroid Build Coastguard Worker args.append('-' + 'O' * value) 297*cda5da8dSAndroid Build Coastguard Worker return args 298*cda5da8dSAndroid Build Coastguard Worker 299*cda5da8dSAndroid Build Coastguard Worker 300*cda5da8dSAndroid Build Coastguard Workerdef _args_from_interpreter_flags(): 301*cda5da8dSAndroid Build Coastguard Worker """Return a list of command-line arguments reproducing the current 302*cda5da8dSAndroid Build Coastguard Worker settings in sys.flags, sys.warnoptions and sys._xoptions.""" 303*cda5da8dSAndroid Build Coastguard Worker flag_opt_map = { 304*cda5da8dSAndroid Build Coastguard Worker 'debug': 'd', 305*cda5da8dSAndroid Build Coastguard Worker # 'inspect': 'i', 306*cda5da8dSAndroid Build Coastguard Worker # 'interactive': 'i', 307*cda5da8dSAndroid Build Coastguard Worker 'dont_write_bytecode': 'B', 308*cda5da8dSAndroid Build Coastguard Worker 'no_site': 'S', 309*cda5da8dSAndroid Build Coastguard Worker 'verbose': 'v', 310*cda5da8dSAndroid Build Coastguard Worker 'bytes_warning': 'b', 311*cda5da8dSAndroid Build Coastguard Worker 'quiet': 'q', 312*cda5da8dSAndroid Build Coastguard Worker # -O is handled in _optim_args_from_interpreter_flags() 313*cda5da8dSAndroid Build Coastguard Worker } 314*cda5da8dSAndroid Build Coastguard Worker args = _optim_args_from_interpreter_flags() 315*cda5da8dSAndroid Build Coastguard Worker for flag, opt in flag_opt_map.items(): 316*cda5da8dSAndroid Build Coastguard Worker v = getattr(sys.flags, flag) 317*cda5da8dSAndroid Build Coastguard Worker if v > 0: 318*cda5da8dSAndroid Build Coastguard Worker args.append('-' + opt * v) 319*cda5da8dSAndroid Build Coastguard Worker 320*cda5da8dSAndroid Build Coastguard Worker if sys.flags.isolated: 321*cda5da8dSAndroid Build Coastguard Worker args.append('-I') 322*cda5da8dSAndroid Build Coastguard Worker else: 323*cda5da8dSAndroid Build Coastguard Worker if sys.flags.ignore_environment: 324*cda5da8dSAndroid Build Coastguard Worker args.append('-E') 325*cda5da8dSAndroid Build Coastguard Worker if sys.flags.no_user_site: 326*cda5da8dSAndroid Build Coastguard Worker args.append('-s') 327*cda5da8dSAndroid Build Coastguard Worker if sys.flags.safe_path: 328*cda5da8dSAndroid Build Coastguard Worker args.append('-P') 329*cda5da8dSAndroid Build Coastguard Worker 330*cda5da8dSAndroid Build Coastguard Worker # -W options 331*cda5da8dSAndroid Build Coastguard Worker warnopts = sys.warnoptions[:] 332*cda5da8dSAndroid Build Coastguard Worker xoptions = getattr(sys, '_xoptions', {}) 333*cda5da8dSAndroid Build Coastguard Worker bytes_warning = sys.flags.bytes_warning 334*cda5da8dSAndroid Build Coastguard Worker dev_mode = sys.flags.dev_mode 335*cda5da8dSAndroid Build Coastguard Worker 336*cda5da8dSAndroid Build Coastguard Worker if bytes_warning > 1: 337*cda5da8dSAndroid Build Coastguard Worker warnopts.remove("error::BytesWarning") 338*cda5da8dSAndroid Build Coastguard Worker elif bytes_warning: 339*cda5da8dSAndroid Build Coastguard Worker warnopts.remove("default::BytesWarning") 340*cda5da8dSAndroid Build Coastguard Worker if dev_mode: 341*cda5da8dSAndroid Build Coastguard Worker warnopts.remove('default') 342*cda5da8dSAndroid Build Coastguard Worker for opt in warnopts: 343*cda5da8dSAndroid Build Coastguard Worker args.append('-W' + opt) 344*cda5da8dSAndroid Build Coastguard Worker 345*cda5da8dSAndroid Build Coastguard Worker # -X options 346*cda5da8dSAndroid Build Coastguard Worker if dev_mode: 347*cda5da8dSAndroid Build Coastguard Worker args.extend(('-X', 'dev')) 348*cda5da8dSAndroid Build Coastguard Worker for opt in ('faulthandler', 'tracemalloc', 'importtime', 349*cda5da8dSAndroid Build Coastguard Worker 'showrefcount', 'utf8'): 350*cda5da8dSAndroid Build Coastguard Worker if opt in xoptions: 351*cda5da8dSAndroid Build Coastguard Worker value = xoptions[opt] 352*cda5da8dSAndroid Build Coastguard Worker if value is True: 353*cda5da8dSAndroid Build Coastguard Worker arg = opt 354*cda5da8dSAndroid Build Coastguard Worker else: 355*cda5da8dSAndroid Build Coastguard Worker arg = '%s=%s' % (opt, value) 356*cda5da8dSAndroid Build Coastguard Worker args.extend(('-X', arg)) 357*cda5da8dSAndroid Build Coastguard Worker 358*cda5da8dSAndroid Build Coastguard Worker return args 359*cda5da8dSAndroid Build Coastguard Worker 360*cda5da8dSAndroid Build Coastguard Worker 361*cda5da8dSAndroid Build Coastguard Workerdef _text_encoding(): 362*cda5da8dSAndroid Build Coastguard Worker # Return default text encoding and emit EncodingWarning if 363*cda5da8dSAndroid Build Coastguard Worker # sys.flags.warn_default_encoding is true. 364*cda5da8dSAndroid Build Coastguard Worker if sys.flags.warn_default_encoding: 365*cda5da8dSAndroid Build Coastguard Worker f = sys._getframe() 366*cda5da8dSAndroid Build Coastguard Worker filename = f.f_code.co_filename 367*cda5da8dSAndroid Build Coastguard Worker stacklevel = 2 368*cda5da8dSAndroid Build Coastguard Worker while f := f.f_back: 369*cda5da8dSAndroid Build Coastguard Worker if f.f_code.co_filename != filename: 370*cda5da8dSAndroid Build Coastguard Worker break 371*cda5da8dSAndroid Build Coastguard Worker stacklevel += 1 372*cda5da8dSAndroid Build Coastguard Worker warnings.warn("'encoding' argument not specified.", 373*cda5da8dSAndroid Build Coastguard Worker EncodingWarning, stacklevel) 374*cda5da8dSAndroid Build Coastguard Worker 375*cda5da8dSAndroid Build Coastguard Worker if sys.flags.utf8_mode: 376*cda5da8dSAndroid Build Coastguard Worker return "utf-8" 377*cda5da8dSAndroid Build Coastguard Worker else: 378*cda5da8dSAndroid Build Coastguard Worker return locale.getencoding() 379*cda5da8dSAndroid Build Coastguard Worker 380*cda5da8dSAndroid Build Coastguard Worker 381*cda5da8dSAndroid Build Coastguard Workerdef call(*popenargs, timeout=None, **kwargs): 382*cda5da8dSAndroid Build Coastguard Worker """Run command with arguments. Wait for command to complete or 383*cda5da8dSAndroid Build Coastguard Worker timeout, then return the returncode attribute. 384*cda5da8dSAndroid Build Coastguard Worker 385*cda5da8dSAndroid Build Coastguard Worker The arguments are the same as for the Popen constructor. Example: 386*cda5da8dSAndroid Build Coastguard Worker 387*cda5da8dSAndroid Build Coastguard Worker retcode = call(["ls", "-l"]) 388*cda5da8dSAndroid Build Coastguard Worker """ 389*cda5da8dSAndroid Build Coastguard Worker with Popen(*popenargs, **kwargs) as p: 390*cda5da8dSAndroid Build Coastguard Worker try: 391*cda5da8dSAndroid Build Coastguard Worker return p.wait(timeout=timeout) 392*cda5da8dSAndroid Build Coastguard Worker except: # Including KeyboardInterrupt, wait handled that. 393*cda5da8dSAndroid Build Coastguard Worker p.kill() 394*cda5da8dSAndroid Build Coastguard Worker # We don't call p.wait() again as p.__exit__ does that for us. 395*cda5da8dSAndroid Build Coastguard Worker raise 396*cda5da8dSAndroid Build Coastguard Worker 397*cda5da8dSAndroid Build Coastguard Worker 398*cda5da8dSAndroid Build Coastguard Workerdef check_call(*popenargs, **kwargs): 399*cda5da8dSAndroid Build Coastguard Worker """Run command with arguments. Wait for command to complete. If 400*cda5da8dSAndroid Build Coastguard Worker the exit code was zero then return, otherwise raise 401*cda5da8dSAndroid Build Coastguard Worker CalledProcessError. The CalledProcessError object will have the 402*cda5da8dSAndroid Build Coastguard Worker return code in the returncode attribute. 403*cda5da8dSAndroid Build Coastguard Worker 404*cda5da8dSAndroid Build Coastguard Worker The arguments are the same as for the call function. Example: 405*cda5da8dSAndroid Build Coastguard Worker 406*cda5da8dSAndroid Build Coastguard Worker check_call(["ls", "-l"]) 407*cda5da8dSAndroid Build Coastguard Worker """ 408*cda5da8dSAndroid Build Coastguard Worker retcode = call(*popenargs, **kwargs) 409*cda5da8dSAndroid Build Coastguard Worker if retcode: 410*cda5da8dSAndroid Build Coastguard Worker cmd = kwargs.get("args") 411*cda5da8dSAndroid Build Coastguard Worker if cmd is None: 412*cda5da8dSAndroid Build Coastguard Worker cmd = popenargs[0] 413*cda5da8dSAndroid Build Coastguard Worker raise CalledProcessError(retcode, cmd) 414*cda5da8dSAndroid Build Coastguard Worker return 0 415*cda5da8dSAndroid Build Coastguard Worker 416*cda5da8dSAndroid Build Coastguard Worker 417*cda5da8dSAndroid Build Coastguard Workerdef check_output(*popenargs, timeout=None, **kwargs): 418*cda5da8dSAndroid Build Coastguard Worker r"""Run command with arguments and return its output. 419*cda5da8dSAndroid Build Coastguard Worker 420*cda5da8dSAndroid Build Coastguard Worker If the exit code was non-zero it raises a CalledProcessError. The 421*cda5da8dSAndroid Build Coastguard Worker CalledProcessError object will have the return code in the returncode 422*cda5da8dSAndroid Build Coastguard Worker attribute and output in the output attribute. 423*cda5da8dSAndroid Build Coastguard Worker 424*cda5da8dSAndroid Build Coastguard Worker The arguments are the same as for the Popen constructor. Example: 425*cda5da8dSAndroid Build Coastguard Worker 426*cda5da8dSAndroid Build Coastguard Worker >>> check_output(["ls", "-l", "/dev/null"]) 427*cda5da8dSAndroid Build Coastguard Worker b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' 428*cda5da8dSAndroid Build Coastguard Worker 429*cda5da8dSAndroid Build Coastguard Worker The stdout argument is not allowed as it is used internally. 430*cda5da8dSAndroid Build Coastguard Worker To capture standard error in the result, use stderr=STDOUT. 431*cda5da8dSAndroid Build Coastguard Worker 432*cda5da8dSAndroid Build Coastguard Worker >>> check_output(["/bin/sh", "-c", 433*cda5da8dSAndroid Build Coastguard Worker ... "ls -l non_existent_file ; exit 0"], 434*cda5da8dSAndroid Build Coastguard Worker ... stderr=STDOUT) 435*cda5da8dSAndroid Build Coastguard Worker b'ls: non_existent_file: No such file or directory\n' 436*cda5da8dSAndroid Build Coastguard Worker 437*cda5da8dSAndroid Build Coastguard Worker There is an additional optional argument, "input", allowing you to 438*cda5da8dSAndroid Build Coastguard Worker pass a string to the subprocess's stdin. If you use this argument 439*cda5da8dSAndroid Build Coastguard Worker you may not also use the Popen constructor's "stdin" argument, as 440*cda5da8dSAndroid Build Coastguard Worker it too will be used internally. Example: 441*cda5da8dSAndroid Build Coastguard Worker 442*cda5da8dSAndroid Build Coastguard Worker >>> check_output(["sed", "-e", "s/foo/bar/"], 443*cda5da8dSAndroid Build Coastguard Worker ... input=b"when in the course of fooman events\n") 444*cda5da8dSAndroid Build Coastguard Worker b'when in the course of barman events\n' 445*cda5da8dSAndroid Build Coastguard Worker 446*cda5da8dSAndroid Build Coastguard Worker By default, all communication is in bytes, and therefore any "input" 447*cda5da8dSAndroid Build Coastguard Worker should be bytes, and the return value will be bytes. If in text mode, 448*cda5da8dSAndroid Build Coastguard Worker any "input" should be a string, and the return value will be a string 449*cda5da8dSAndroid Build Coastguard Worker decoded according to locale encoding, or by "encoding" if set. Text mode 450*cda5da8dSAndroid Build Coastguard Worker is triggered by setting any of text, encoding, errors or universal_newlines. 451*cda5da8dSAndroid Build Coastguard Worker """ 452*cda5da8dSAndroid Build Coastguard Worker for kw in ('stdout', 'check'): 453*cda5da8dSAndroid Build Coastguard Worker if kw in kwargs: 454*cda5da8dSAndroid Build Coastguard Worker raise ValueError(f'{kw} argument not allowed, it will be overridden.') 455*cda5da8dSAndroid Build Coastguard Worker 456*cda5da8dSAndroid Build Coastguard Worker if 'input' in kwargs and kwargs['input'] is None: 457*cda5da8dSAndroid Build Coastguard Worker # Explicitly passing input=None was previously equivalent to passing an 458*cda5da8dSAndroid Build Coastguard Worker # empty string. That is maintained here for backwards compatibility. 459*cda5da8dSAndroid Build Coastguard Worker if kwargs.get('universal_newlines') or kwargs.get('text') or kwargs.get('encoding') \ 460*cda5da8dSAndroid Build Coastguard Worker or kwargs.get('errors'): 461*cda5da8dSAndroid Build Coastguard Worker empty = '' 462*cda5da8dSAndroid Build Coastguard Worker else: 463*cda5da8dSAndroid Build Coastguard Worker empty = b'' 464*cda5da8dSAndroid Build Coastguard Worker kwargs['input'] = empty 465*cda5da8dSAndroid Build Coastguard Worker 466*cda5da8dSAndroid Build Coastguard Worker return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, 467*cda5da8dSAndroid Build Coastguard Worker **kwargs).stdout 468*cda5da8dSAndroid Build Coastguard Worker 469*cda5da8dSAndroid Build Coastguard Worker 470*cda5da8dSAndroid Build Coastguard Workerclass CompletedProcess(object): 471*cda5da8dSAndroid Build Coastguard Worker """A process that has finished running. 472*cda5da8dSAndroid Build Coastguard Worker 473*cda5da8dSAndroid Build Coastguard Worker This is returned by run(). 474*cda5da8dSAndroid Build Coastguard Worker 475*cda5da8dSAndroid Build Coastguard Worker Attributes: 476*cda5da8dSAndroid Build Coastguard Worker args: The list or str args passed to run(). 477*cda5da8dSAndroid Build Coastguard Worker returncode: The exit code of the process, negative for signals. 478*cda5da8dSAndroid Build Coastguard Worker stdout: The standard output (None if not captured). 479*cda5da8dSAndroid Build Coastguard Worker stderr: The standard error (None if not captured). 480*cda5da8dSAndroid Build Coastguard Worker """ 481*cda5da8dSAndroid Build Coastguard Worker def __init__(self, args, returncode, stdout=None, stderr=None): 482*cda5da8dSAndroid Build Coastguard Worker self.args = args 483*cda5da8dSAndroid Build Coastguard Worker self.returncode = returncode 484*cda5da8dSAndroid Build Coastguard Worker self.stdout = stdout 485*cda5da8dSAndroid Build Coastguard Worker self.stderr = stderr 486*cda5da8dSAndroid Build Coastguard Worker 487*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 488*cda5da8dSAndroid Build Coastguard Worker args = ['args={!r}'.format(self.args), 489*cda5da8dSAndroid Build Coastguard Worker 'returncode={!r}'.format(self.returncode)] 490*cda5da8dSAndroid Build Coastguard Worker if self.stdout is not None: 491*cda5da8dSAndroid Build Coastguard Worker args.append('stdout={!r}'.format(self.stdout)) 492*cda5da8dSAndroid Build Coastguard Worker if self.stderr is not None: 493*cda5da8dSAndroid Build Coastguard Worker args.append('stderr={!r}'.format(self.stderr)) 494*cda5da8dSAndroid Build Coastguard Worker return "{}({})".format(type(self).__name__, ', '.join(args)) 495*cda5da8dSAndroid Build Coastguard Worker 496*cda5da8dSAndroid Build Coastguard Worker __class_getitem__ = classmethod(types.GenericAlias) 497*cda5da8dSAndroid Build Coastguard Worker 498*cda5da8dSAndroid Build Coastguard Worker 499*cda5da8dSAndroid Build Coastguard Worker def check_returncode(self): 500*cda5da8dSAndroid Build Coastguard Worker """Raise CalledProcessError if the exit code is non-zero.""" 501*cda5da8dSAndroid Build Coastguard Worker if self.returncode: 502*cda5da8dSAndroid Build Coastguard Worker raise CalledProcessError(self.returncode, self.args, self.stdout, 503*cda5da8dSAndroid Build Coastguard Worker self.stderr) 504*cda5da8dSAndroid Build Coastguard Worker 505*cda5da8dSAndroid Build Coastguard Worker 506*cda5da8dSAndroid Build Coastguard Workerdef run(*popenargs, 507*cda5da8dSAndroid Build Coastguard Worker input=None, capture_output=False, timeout=None, check=False, **kwargs): 508*cda5da8dSAndroid Build Coastguard Worker """Run command with arguments and return a CompletedProcess instance. 509*cda5da8dSAndroid Build Coastguard Worker 510*cda5da8dSAndroid Build Coastguard Worker The returned instance will have attributes args, returncode, stdout and 511*cda5da8dSAndroid Build Coastguard Worker stderr. By default, stdout and stderr are not captured, and those attributes 512*cda5da8dSAndroid Build Coastguard Worker will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them, 513*cda5da8dSAndroid Build Coastguard Worker or pass capture_output=True to capture both. 514*cda5da8dSAndroid Build Coastguard Worker 515*cda5da8dSAndroid Build Coastguard Worker If check is True and the exit code was non-zero, it raises a 516*cda5da8dSAndroid Build Coastguard Worker CalledProcessError. The CalledProcessError object will have the return code 517*cda5da8dSAndroid Build Coastguard Worker in the returncode attribute, and output & stderr attributes if those streams 518*cda5da8dSAndroid Build Coastguard Worker were captured. 519*cda5da8dSAndroid Build Coastguard Worker 520*cda5da8dSAndroid Build Coastguard Worker If timeout is given, and the process takes too long, a TimeoutExpired 521*cda5da8dSAndroid Build Coastguard Worker exception will be raised. 522*cda5da8dSAndroid Build Coastguard Worker 523*cda5da8dSAndroid Build Coastguard Worker There is an optional argument "input", allowing you to 524*cda5da8dSAndroid Build Coastguard Worker pass bytes or a string to the subprocess's stdin. If you use this argument 525*cda5da8dSAndroid Build Coastguard Worker you may not also use the Popen constructor's "stdin" argument, as 526*cda5da8dSAndroid Build Coastguard Worker it will be used internally. 527*cda5da8dSAndroid Build Coastguard Worker 528*cda5da8dSAndroid Build Coastguard Worker By default, all communication is in bytes, and therefore any "input" should 529*cda5da8dSAndroid Build Coastguard Worker be bytes, and the stdout and stderr will be bytes. If in text mode, any 530*cda5da8dSAndroid Build Coastguard Worker "input" should be a string, and stdout and stderr will be strings decoded 531*cda5da8dSAndroid Build Coastguard Worker according to locale encoding, or by "encoding" if set. Text mode is 532*cda5da8dSAndroid Build Coastguard Worker triggered by setting any of text, encoding, errors or universal_newlines. 533*cda5da8dSAndroid Build Coastguard Worker 534*cda5da8dSAndroid Build Coastguard Worker The other arguments are the same as for the Popen constructor. 535*cda5da8dSAndroid Build Coastguard Worker """ 536*cda5da8dSAndroid Build Coastguard Worker if input is not None: 537*cda5da8dSAndroid Build Coastguard Worker if kwargs.get('stdin') is not None: 538*cda5da8dSAndroid Build Coastguard Worker raise ValueError('stdin and input arguments may not both be used.') 539*cda5da8dSAndroid Build Coastguard Worker kwargs['stdin'] = PIPE 540*cda5da8dSAndroid Build Coastguard Worker 541*cda5da8dSAndroid Build Coastguard Worker if capture_output: 542*cda5da8dSAndroid Build Coastguard Worker if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None: 543*cda5da8dSAndroid Build Coastguard Worker raise ValueError('stdout and stderr arguments may not be used ' 544*cda5da8dSAndroid Build Coastguard Worker 'with capture_output.') 545*cda5da8dSAndroid Build Coastguard Worker kwargs['stdout'] = PIPE 546*cda5da8dSAndroid Build Coastguard Worker kwargs['stderr'] = PIPE 547*cda5da8dSAndroid Build Coastguard Worker 548*cda5da8dSAndroid Build Coastguard Worker with Popen(*popenargs, **kwargs) as process: 549*cda5da8dSAndroid Build Coastguard Worker try: 550*cda5da8dSAndroid Build Coastguard Worker stdout, stderr = process.communicate(input, timeout=timeout) 551*cda5da8dSAndroid Build Coastguard Worker except TimeoutExpired as exc: 552*cda5da8dSAndroid Build Coastguard Worker process.kill() 553*cda5da8dSAndroid Build Coastguard Worker if _mswindows: 554*cda5da8dSAndroid Build Coastguard Worker # Windows accumulates the output in a single blocking 555*cda5da8dSAndroid Build Coastguard Worker # read() call run on child threads, with the timeout 556*cda5da8dSAndroid Build Coastguard Worker # being done in a join() on those threads. communicate() 557*cda5da8dSAndroid Build Coastguard Worker # _after_ kill() is required to collect that and add it 558*cda5da8dSAndroid Build Coastguard Worker # to the exception. 559*cda5da8dSAndroid Build Coastguard Worker exc.stdout, exc.stderr = process.communicate() 560*cda5da8dSAndroid Build Coastguard Worker else: 561*cda5da8dSAndroid Build Coastguard Worker # POSIX _communicate already populated the output so 562*cda5da8dSAndroid Build Coastguard Worker # far into the TimeoutExpired exception. 563*cda5da8dSAndroid Build Coastguard Worker process.wait() 564*cda5da8dSAndroid Build Coastguard Worker raise 565*cda5da8dSAndroid Build Coastguard Worker except: # Including KeyboardInterrupt, communicate handled that. 566*cda5da8dSAndroid Build Coastguard Worker process.kill() 567*cda5da8dSAndroid Build Coastguard Worker # We don't call process.wait() as .__exit__ does that for us. 568*cda5da8dSAndroid Build Coastguard Worker raise 569*cda5da8dSAndroid Build Coastguard Worker retcode = process.poll() 570*cda5da8dSAndroid Build Coastguard Worker if check and retcode: 571*cda5da8dSAndroid Build Coastguard Worker raise CalledProcessError(retcode, process.args, 572*cda5da8dSAndroid Build Coastguard Worker output=stdout, stderr=stderr) 573*cda5da8dSAndroid Build Coastguard Worker return CompletedProcess(process.args, retcode, stdout, stderr) 574*cda5da8dSAndroid Build Coastguard Worker 575*cda5da8dSAndroid Build Coastguard Worker 576*cda5da8dSAndroid Build Coastguard Workerdef list2cmdline(seq): 577*cda5da8dSAndroid Build Coastguard Worker """ 578*cda5da8dSAndroid Build Coastguard Worker Translate a sequence of arguments into a command line 579*cda5da8dSAndroid Build Coastguard Worker string, using the same rules as the MS C runtime: 580*cda5da8dSAndroid Build Coastguard Worker 581*cda5da8dSAndroid Build Coastguard Worker 1) Arguments are delimited by white space, which is either a 582*cda5da8dSAndroid Build Coastguard Worker space or a tab. 583*cda5da8dSAndroid Build Coastguard Worker 584*cda5da8dSAndroid Build Coastguard Worker 2) A string surrounded by double quotation marks is 585*cda5da8dSAndroid Build Coastguard Worker interpreted as a single argument, regardless of white space 586*cda5da8dSAndroid Build Coastguard Worker contained within. A quoted string can be embedded in an 587*cda5da8dSAndroid Build Coastguard Worker argument. 588*cda5da8dSAndroid Build Coastguard Worker 589*cda5da8dSAndroid Build Coastguard Worker 3) A double quotation mark preceded by a backslash is 590*cda5da8dSAndroid Build Coastguard Worker interpreted as a literal double quotation mark. 591*cda5da8dSAndroid Build Coastguard Worker 592*cda5da8dSAndroid Build Coastguard Worker 4) Backslashes are interpreted literally, unless they 593*cda5da8dSAndroid Build Coastguard Worker immediately precede a double quotation mark. 594*cda5da8dSAndroid Build Coastguard Worker 595*cda5da8dSAndroid Build Coastguard Worker 5) If backslashes immediately precede a double quotation mark, 596*cda5da8dSAndroid Build Coastguard Worker every pair of backslashes is interpreted as a literal 597*cda5da8dSAndroid Build Coastguard Worker backslash. If the number of backslashes is odd, the last 598*cda5da8dSAndroid Build Coastguard Worker backslash escapes the next double quotation mark as 599*cda5da8dSAndroid Build Coastguard Worker described in rule 3. 600*cda5da8dSAndroid Build Coastguard Worker """ 601*cda5da8dSAndroid Build Coastguard Worker 602*cda5da8dSAndroid Build Coastguard Worker # See 603*cda5da8dSAndroid Build Coastguard Worker # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx 604*cda5da8dSAndroid Build Coastguard Worker # or search http://msdn.microsoft.com for 605*cda5da8dSAndroid Build Coastguard Worker # "Parsing C++ Command-Line Arguments" 606*cda5da8dSAndroid Build Coastguard Worker result = [] 607*cda5da8dSAndroid Build Coastguard Worker needquote = False 608*cda5da8dSAndroid Build Coastguard Worker for arg in map(os.fsdecode, seq): 609*cda5da8dSAndroid Build Coastguard Worker bs_buf = [] 610*cda5da8dSAndroid Build Coastguard Worker 611*cda5da8dSAndroid Build Coastguard Worker # Add a space to separate this argument from the others 612*cda5da8dSAndroid Build Coastguard Worker if result: 613*cda5da8dSAndroid Build Coastguard Worker result.append(' ') 614*cda5da8dSAndroid Build Coastguard Worker 615*cda5da8dSAndroid Build Coastguard Worker needquote = (" " in arg) or ("\t" in arg) or not arg 616*cda5da8dSAndroid Build Coastguard Worker if needquote: 617*cda5da8dSAndroid Build Coastguard Worker result.append('"') 618*cda5da8dSAndroid Build Coastguard Worker 619*cda5da8dSAndroid Build Coastguard Worker for c in arg: 620*cda5da8dSAndroid Build Coastguard Worker if c == '\\': 621*cda5da8dSAndroid Build Coastguard Worker # Don't know if we need to double yet. 622*cda5da8dSAndroid Build Coastguard Worker bs_buf.append(c) 623*cda5da8dSAndroid Build Coastguard Worker elif c == '"': 624*cda5da8dSAndroid Build Coastguard Worker # Double backslashes. 625*cda5da8dSAndroid Build Coastguard Worker result.append('\\' * len(bs_buf)*2) 626*cda5da8dSAndroid Build Coastguard Worker bs_buf = [] 627*cda5da8dSAndroid Build Coastguard Worker result.append('\\"') 628*cda5da8dSAndroid Build Coastguard Worker else: 629*cda5da8dSAndroid Build Coastguard Worker # Normal char 630*cda5da8dSAndroid Build Coastguard Worker if bs_buf: 631*cda5da8dSAndroid Build Coastguard Worker result.extend(bs_buf) 632*cda5da8dSAndroid Build Coastguard Worker bs_buf = [] 633*cda5da8dSAndroid Build Coastguard Worker result.append(c) 634*cda5da8dSAndroid Build Coastguard Worker 635*cda5da8dSAndroid Build Coastguard Worker # Add remaining backslashes, if any. 636*cda5da8dSAndroid Build Coastguard Worker if bs_buf: 637*cda5da8dSAndroid Build Coastguard Worker result.extend(bs_buf) 638*cda5da8dSAndroid Build Coastguard Worker 639*cda5da8dSAndroid Build Coastguard Worker if needquote: 640*cda5da8dSAndroid Build Coastguard Worker result.extend(bs_buf) 641*cda5da8dSAndroid Build Coastguard Worker result.append('"') 642*cda5da8dSAndroid Build Coastguard Worker 643*cda5da8dSAndroid Build Coastguard Worker return ''.join(result) 644*cda5da8dSAndroid Build Coastguard Worker 645*cda5da8dSAndroid Build Coastguard Worker 646*cda5da8dSAndroid Build Coastguard Worker# Various tools for executing commands and looking at their output and status. 647*cda5da8dSAndroid Build Coastguard Worker# 648*cda5da8dSAndroid Build Coastguard Worker 649*cda5da8dSAndroid Build Coastguard Workerdef getstatusoutput(cmd, *, encoding=None, errors=None): 650*cda5da8dSAndroid Build Coastguard Worker """Return (exitcode, output) of executing cmd in a shell. 651*cda5da8dSAndroid Build Coastguard Worker 652*cda5da8dSAndroid Build Coastguard Worker Execute the string 'cmd' in a shell with 'check_output' and 653*cda5da8dSAndroid Build Coastguard Worker return a 2-tuple (status, output). The locale encoding is used 654*cda5da8dSAndroid Build Coastguard Worker to decode the output and process newlines. 655*cda5da8dSAndroid Build Coastguard Worker 656*cda5da8dSAndroid Build Coastguard Worker A trailing newline is stripped from the output. 657*cda5da8dSAndroid Build Coastguard Worker The exit status for the command can be interpreted 658*cda5da8dSAndroid Build Coastguard Worker according to the rules for the function 'wait'. Example: 659*cda5da8dSAndroid Build Coastguard Worker 660*cda5da8dSAndroid Build Coastguard Worker >>> import subprocess 661*cda5da8dSAndroid Build Coastguard Worker >>> subprocess.getstatusoutput('ls /bin/ls') 662*cda5da8dSAndroid Build Coastguard Worker (0, '/bin/ls') 663*cda5da8dSAndroid Build Coastguard Worker >>> subprocess.getstatusoutput('cat /bin/junk') 664*cda5da8dSAndroid Build Coastguard Worker (1, 'cat: /bin/junk: No such file or directory') 665*cda5da8dSAndroid Build Coastguard Worker >>> subprocess.getstatusoutput('/bin/junk') 666*cda5da8dSAndroid Build Coastguard Worker (127, 'sh: /bin/junk: not found') 667*cda5da8dSAndroid Build Coastguard Worker >>> subprocess.getstatusoutput('/bin/kill $$') 668*cda5da8dSAndroid Build Coastguard Worker (-15, '') 669*cda5da8dSAndroid Build Coastguard Worker """ 670*cda5da8dSAndroid Build Coastguard Worker try: 671*cda5da8dSAndroid Build Coastguard Worker data = check_output(cmd, shell=True, text=True, stderr=STDOUT, 672*cda5da8dSAndroid Build Coastguard Worker encoding=encoding, errors=errors) 673*cda5da8dSAndroid Build Coastguard Worker exitcode = 0 674*cda5da8dSAndroid Build Coastguard Worker except CalledProcessError as ex: 675*cda5da8dSAndroid Build Coastguard Worker data = ex.output 676*cda5da8dSAndroid Build Coastguard Worker exitcode = ex.returncode 677*cda5da8dSAndroid Build Coastguard Worker if data[-1:] == '\n': 678*cda5da8dSAndroid Build Coastguard Worker data = data[:-1] 679*cda5da8dSAndroid Build Coastguard Worker return exitcode, data 680*cda5da8dSAndroid Build Coastguard Worker 681*cda5da8dSAndroid Build Coastguard Workerdef getoutput(cmd, *, encoding=None, errors=None): 682*cda5da8dSAndroid Build Coastguard Worker """Return output (stdout or stderr) of executing cmd in a shell. 683*cda5da8dSAndroid Build Coastguard Worker 684*cda5da8dSAndroid Build Coastguard Worker Like getstatusoutput(), except the exit status is ignored and the return 685*cda5da8dSAndroid Build Coastguard Worker value is a string containing the command's output. Example: 686*cda5da8dSAndroid Build Coastguard Worker 687*cda5da8dSAndroid Build Coastguard Worker >>> import subprocess 688*cda5da8dSAndroid Build Coastguard Worker >>> subprocess.getoutput('ls /bin/ls') 689*cda5da8dSAndroid Build Coastguard Worker '/bin/ls' 690*cda5da8dSAndroid Build Coastguard Worker """ 691*cda5da8dSAndroid Build Coastguard Worker return getstatusoutput(cmd, encoding=encoding, errors=errors)[1] 692*cda5da8dSAndroid Build Coastguard Worker 693*cda5da8dSAndroid Build Coastguard Worker 694*cda5da8dSAndroid Build Coastguard Worker 695*cda5da8dSAndroid Build Coastguard Workerdef _use_posix_spawn(): 696*cda5da8dSAndroid Build Coastguard Worker """Check if posix_spawn() can be used for subprocess. 697*cda5da8dSAndroid Build Coastguard Worker 698*cda5da8dSAndroid Build Coastguard Worker subprocess requires a posix_spawn() implementation that properly reports 699*cda5da8dSAndroid Build Coastguard Worker errors to the parent process, & sets errno on the following failures: 700*cda5da8dSAndroid Build Coastguard Worker 701*cda5da8dSAndroid Build Coastguard Worker * Process attribute actions failed. 702*cda5da8dSAndroid Build Coastguard Worker * File actions failed. 703*cda5da8dSAndroid Build Coastguard Worker * exec() failed. 704*cda5da8dSAndroid Build Coastguard Worker 705*cda5da8dSAndroid Build Coastguard Worker Prefer an implementation which can use vfork() in some cases for best 706*cda5da8dSAndroid Build Coastguard Worker performance. 707*cda5da8dSAndroid Build Coastguard Worker """ 708*cda5da8dSAndroid Build Coastguard Worker if _mswindows or not hasattr(os, 'posix_spawn'): 709*cda5da8dSAndroid Build Coastguard Worker # os.posix_spawn() is not available 710*cda5da8dSAndroid Build Coastguard Worker return False 711*cda5da8dSAndroid Build Coastguard Worker 712*cda5da8dSAndroid Build Coastguard Worker if sys.platform in ('darwin', 'sunos5'): 713*cda5da8dSAndroid Build Coastguard Worker # posix_spawn() is a syscall on both macOS and Solaris, 714*cda5da8dSAndroid Build Coastguard Worker # and properly reports errors 715*cda5da8dSAndroid Build Coastguard Worker return True 716*cda5da8dSAndroid Build Coastguard Worker 717*cda5da8dSAndroid Build Coastguard Worker # Check libc name and runtime libc version 718*cda5da8dSAndroid Build Coastguard Worker try: 719*cda5da8dSAndroid Build Coastguard Worker ver = os.confstr('CS_GNU_LIBC_VERSION') 720*cda5da8dSAndroid Build Coastguard Worker # parse 'glibc 2.28' as ('glibc', (2, 28)) 721*cda5da8dSAndroid Build Coastguard Worker parts = ver.split(maxsplit=1) 722*cda5da8dSAndroid Build Coastguard Worker if len(parts) != 2: 723*cda5da8dSAndroid Build Coastguard Worker # reject unknown format 724*cda5da8dSAndroid Build Coastguard Worker raise ValueError 725*cda5da8dSAndroid Build Coastguard Worker libc = parts[0] 726*cda5da8dSAndroid Build Coastguard Worker version = tuple(map(int, parts[1].split('.'))) 727*cda5da8dSAndroid Build Coastguard Worker 728*cda5da8dSAndroid Build Coastguard Worker if sys.platform == 'linux' and libc == 'glibc' and version >= (2, 24): 729*cda5da8dSAndroid Build Coastguard Worker # glibc 2.24 has a new Linux posix_spawn implementation using vfork 730*cda5da8dSAndroid Build Coastguard Worker # which properly reports errors to the parent process. 731*cda5da8dSAndroid Build Coastguard Worker return True 732*cda5da8dSAndroid Build Coastguard Worker # Note: Don't use the implementation in earlier glibc because it doesn't 733*cda5da8dSAndroid Build Coastguard Worker # use vfork (even if glibc 2.26 added a pipe to properly report errors 734*cda5da8dSAndroid Build Coastguard Worker # to the parent process). 735*cda5da8dSAndroid Build Coastguard Worker except (AttributeError, ValueError, OSError): 736*cda5da8dSAndroid Build Coastguard Worker # os.confstr() or CS_GNU_LIBC_VERSION value not available 737*cda5da8dSAndroid Build Coastguard Worker pass 738*cda5da8dSAndroid Build Coastguard Worker 739*cda5da8dSAndroid Build Coastguard Worker # By default, assume that posix_spawn() does not properly report errors. 740*cda5da8dSAndroid Build Coastguard Worker return False 741*cda5da8dSAndroid Build Coastguard Worker 742*cda5da8dSAndroid Build Coastguard Worker 743*cda5da8dSAndroid Build Coastguard Worker# These are primarily fail-safe knobs for negatives. A True value does not 744*cda5da8dSAndroid Build Coastguard Worker# guarantee the given libc/syscall API will be used. 745*cda5da8dSAndroid Build Coastguard Worker_USE_POSIX_SPAWN = _use_posix_spawn() 746*cda5da8dSAndroid Build Coastguard Worker_USE_VFORK = True 747*cda5da8dSAndroid Build Coastguard Worker 748*cda5da8dSAndroid Build Coastguard Worker 749*cda5da8dSAndroid Build Coastguard Workerclass Popen: 750*cda5da8dSAndroid Build Coastguard Worker """ Execute a child program in a new process. 751*cda5da8dSAndroid Build Coastguard Worker 752*cda5da8dSAndroid Build Coastguard Worker For a complete description of the arguments see the Python documentation. 753*cda5da8dSAndroid Build Coastguard Worker 754*cda5da8dSAndroid Build Coastguard Worker Arguments: 755*cda5da8dSAndroid Build Coastguard Worker args: A string, or a sequence of program arguments. 756*cda5da8dSAndroid Build Coastguard Worker 757*cda5da8dSAndroid Build Coastguard Worker bufsize: supplied as the buffering argument to the open() function when 758*cda5da8dSAndroid Build Coastguard Worker creating the stdin/stdout/stderr pipe file objects 759*cda5da8dSAndroid Build Coastguard Worker 760*cda5da8dSAndroid Build Coastguard Worker executable: A replacement program to execute. 761*cda5da8dSAndroid Build Coastguard Worker 762*cda5da8dSAndroid Build Coastguard Worker stdin, stdout and stderr: These specify the executed programs' standard 763*cda5da8dSAndroid Build Coastguard Worker input, standard output and standard error file handles, respectively. 764*cda5da8dSAndroid Build Coastguard Worker 765*cda5da8dSAndroid Build Coastguard Worker preexec_fn: (POSIX only) An object to be called in the child process 766*cda5da8dSAndroid Build Coastguard Worker just before the child is executed. 767*cda5da8dSAndroid Build Coastguard Worker 768*cda5da8dSAndroid Build Coastguard Worker close_fds: Controls closing or inheriting of file descriptors. 769*cda5da8dSAndroid Build Coastguard Worker 770*cda5da8dSAndroid Build Coastguard Worker shell: If true, the command will be executed through the shell. 771*cda5da8dSAndroid Build Coastguard Worker 772*cda5da8dSAndroid Build Coastguard Worker cwd: Sets the current directory before the child is executed. 773*cda5da8dSAndroid Build Coastguard Worker 774*cda5da8dSAndroid Build Coastguard Worker env: Defines the environment variables for the new process. 775*cda5da8dSAndroid Build Coastguard Worker 776*cda5da8dSAndroid Build Coastguard Worker text: If true, decode stdin, stdout and stderr using the given encoding 777*cda5da8dSAndroid Build Coastguard Worker (if set) or the system default otherwise. 778*cda5da8dSAndroid Build Coastguard Worker 779*cda5da8dSAndroid Build Coastguard Worker universal_newlines: Alias of text, provided for backwards compatibility. 780*cda5da8dSAndroid Build Coastguard Worker 781*cda5da8dSAndroid Build Coastguard Worker startupinfo and creationflags (Windows only) 782*cda5da8dSAndroid Build Coastguard Worker 783*cda5da8dSAndroid Build Coastguard Worker restore_signals (POSIX only) 784*cda5da8dSAndroid Build Coastguard Worker 785*cda5da8dSAndroid Build Coastguard Worker start_new_session (POSIX only) 786*cda5da8dSAndroid Build Coastguard Worker 787*cda5da8dSAndroid Build Coastguard Worker process_group (POSIX only) 788*cda5da8dSAndroid Build Coastguard Worker 789*cda5da8dSAndroid Build Coastguard Worker group (POSIX only) 790*cda5da8dSAndroid Build Coastguard Worker 791*cda5da8dSAndroid Build Coastguard Worker extra_groups (POSIX only) 792*cda5da8dSAndroid Build Coastguard Worker 793*cda5da8dSAndroid Build Coastguard Worker user (POSIX only) 794*cda5da8dSAndroid Build Coastguard Worker 795*cda5da8dSAndroid Build Coastguard Worker umask (POSIX only) 796*cda5da8dSAndroid Build Coastguard Worker 797*cda5da8dSAndroid Build Coastguard Worker pass_fds (POSIX only) 798*cda5da8dSAndroid Build Coastguard Worker 799*cda5da8dSAndroid Build Coastguard Worker encoding and errors: Text mode encoding and error handling to use for 800*cda5da8dSAndroid Build Coastguard Worker file objects stdin, stdout and stderr. 801*cda5da8dSAndroid Build Coastguard Worker 802*cda5da8dSAndroid Build Coastguard Worker Attributes: 803*cda5da8dSAndroid Build Coastguard Worker stdin, stdout, stderr, pid, returncode 804*cda5da8dSAndroid Build Coastguard Worker """ 805*cda5da8dSAndroid Build Coastguard Worker _child_created = False # Set here since __del__ checks it 806*cda5da8dSAndroid Build Coastguard Worker 807*cda5da8dSAndroid Build Coastguard Worker def __init__(self, args, bufsize=-1, executable=None, 808*cda5da8dSAndroid Build Coastguard Worker stdin=None, stdout=None, stderr=None, 809*cda5da8dSAndroid Build Coastguard Worker preexec_fn=None, close_fds=True, 810*cda5da8dSAndroid Build Coastguard Worker shell=False, cwd=None, env=None, universal_newlines=None, 811*cda5da8dSAndroid Build Coastguard Worker startupinfo=None, creationflags=0, 812*cda5da8dSAndroid Build Coastguard Worker restore_signals=True, start_new_session=False, 813*cda5da8dSAndroid Build Coastguard Worker pass_fds=(), *, user=None, group=None, extra_groups=None, 814*cda5da8dSAndroid Build Coastguard Worker encoding=None, errors=None, text=None, umask=-1, pipesize=-1, 815*cda5da8dSAndroid Build Coastguard Worker process_group=None): 816*cda5da8dSAndroid Build Coastguard Worker """Create new Popen instance.""" 817*cda5da8dSAndroid Build Coastguard Worker if not _can_fork_exec: 818*cda5da8dSAndroid Build Coastguard Worker raise OSError( 819*cda5da8dSAndroid Build Coastguard Worker errno.ENOTSUP, f"{sys.platform} does not support processes." 820*cda5da8dSAndroid Build Coastguard Worker ) 821*cda5da8dSAndroid Build Coastguard Worker 822*cda5da8dSAndroid Build Coastguard Worker _cleanup() 823*cda5da8dSAndroid Build Coastguard Worker # Held while anything is calling waitpid before returncode has been 824*cda5da8dSAndroid Build Coastguard Worker # updated to prevent clobbering returncode if wait() or poll() are 825*cda5da8dSAndroid Build Coastguard Worker # called from multiple threads at once. After acquiring the lock, 826*cda5da8dSAndroid Build Coastguard Worker # code must re-check self.returncode to see if another thread just 827*cda5da8dSAndroid Build Coastguard Worker # finished a waitpid() call. 828*cda5da8dSAndroid Build Coastguard Worker self._waitpid_lock = threading.Lock() 829*cda5da8dSAndroid Build Coastguard Worker 830*cda5da8dSAndroid Build Coastguard Worker self._input = None 831*cda5da8dSAndroid Build Coastguard Worker self._communication_started = False 832*cda5da8dSAndroid Build Coastguard Worker if bufsize is None: 833*cda5da8dSAndroid Build Coastguard Worker bufsize = -1 # Restore default 834*cda5da8dSAndroid Build Coastguard Worker if not isinstance(bufsize, int): 835*cda5da8dSAndroid Build Coastguard Worker raise TypeError("bufsize must be an integer") 836*cda5da8dSAndroid Build Coastguard Worker 837*cda5da8dSAndroid Build Coastguard Worker if pipesize is None: 838*cda5da8dSAndroid Build Coastguard Worker pipesize = -1 # Restore default 839*cda5da8dSAndroid Build Coastguard Worker if not isinstance(pipesize, int): 840*cda5da8dSAndroid Build Coastguard Worker raise TypeError("pipesize must be an integer") 841*cda5da8dSAndroid Build Coastguard Worker 842*cda5da8dSAndroid Build Coastguard Worker if _mswindows: 843*cda5da8dSAndroid Build Coastguard Worker if preexec_fn is not None: 844*cda5da8dSAndroid Build Coastguard Worker raise ValueError("preexec_fn is not supported on Windows " 845*cda5da8dSAndroid Build Coastguard Worker "platforms") 846*cda5da8dSAndroid Build Coastguard Worker else: 847*cda5da8dSAndroid Build Coastguard Worker # POSIX 848*cda5da8dSAndroid Build Coastguard Worker if pass_fds and not close_fds: 849*cda5da8dSAndroid Build Coastguard Worker warnings.warn("pass_fds overriding close_fds.", RuntimeWarning) 850*cda5da8dSAndroid Build Coastguard Worker close_fds = True 851*cda5da8dSAndroid Build Coastguard Worker if startupinfo is not None: 852*cda5da8dSAndroid Build Coastguard Worker raise ValueError("startupinfo is only supported on Windows " 853*cda5da8dSAndroid Build Coastguard Worker "platforms") 854*cda5da8dSAndroid Build Coastguard Worker if creationflags != 0: 855*cda5da8dSAndroid Build Coastguard Worker raise ValueError("creationflags is only supported on Windows " 856*cda5da8dSAndroid Build Coastguard Worker "platforms") 857*cda5da8dSAndroid Build Coastguard Worker 858*cda5da8dSAndroid Build Coastguard Worker self.args = args 859*cda5da8dSAndroid Build Coastguard Worker self.stdin = None 860*cda5da8dSAndroid Build Coastguard Worker self.stdout = None 861*cda5da8dSAndroid Build Coastguard Worker self.stderr = None 862*cda5da8dSAndroid Build Coastguard Worker self.pid = None 863*cda5da8dSAndroid Build Coastguard Worker self.returncode = None 864*cda5da8dSAndroid Build Coastguard Worker self.encoding = encoding 865*cda5da8dSAndroid Build Coastguard Worker self.errors = errors 866*cda5da8dSAndroid Build Coastguard Worker self.pipesize = pipesize 867*cda5da8dSAndroid Build Coastguard Worker 868*cda5da8dSAndroid Build Coastguard Worker # Validate the combinations of text and universal_newlines 869*cda5da8dSAndroid Build Coastguard Worker if (text is not None and universal_newlines is not None 870*cda5da8dSAndroid Build Coastguard Worker and bool(universal_newlines) != bool(text)): 871*cda5da8dSAndroid Build Coastguard Worker raise SubprocessError('Cannot disambiguate when both text ' 872*cda5da8dSAndroid Build Coastguard Worker 'and universal_newlines are supplied but ' 873*cda5da8dSAndroid Build Coastguard Worker 'different. Pass one or the other.') 874*cda5da8dSAndroid Build Coastguard Worker 875*cda5da8dSAndroid Build Coastguard Worker self.text_mode = encoding or errors or text or universal_newlines 876*cda5da8dSAndroid Build Coastguard Worker if self.text_mode and encoding is None: 877*cda5da8dSAndroid Build Coastguard Worker self.encoding = encoding = _text_encoding() 878*cda5da8dSAndroid Build Coastguard Worker 879*cda5da8dSAndroid Build Coastguard Worker # How long to resume waiting on a child after the first ^C. 880*cda5da8dSAndroid Build Coastguard Worker # There is no right value for this. The purpose is to be polite 881*cda5da8dSAndroid Build Coastguard Worker # yet remain good for interactive users trying to exit a tool. 882*cda5da8dSAndroid Build Coastguard Worker self._sigint_wait_secs = 0.25 # 1/xkcd221.getRandomNumber() 883*cda5da8dSAndroid Build Coastguard Worker 884*cda5da8dSAndroid Build Coastguard Worker self._closed_child_pipe_fds = False 885*cda5da8dSAndroid Build Coastguard Worker 886*cda5da8dSAndroid Build Coastguard Worker if self.text_mode: 887*cda5da8dSAndroid Build Coastguard Worker if bufsize == 1: 888*cda5da8dSAndroid Build Coastguard Worker line_buffering = True 889*cda5da8dSAndroid Build Coastguard Worker # Use the default buffer size for the underlying binary streams 890*cda5da8dSAndroid Build Coastguard Worker # since they don't support line buffering. 891*cda5da8dSAndroid Build Coastguard Worker bufsize = -1 892*cda5da8dSAndroid Build Coastguard Worker else: 893*cda5da8dSAndroid Build Coastguard Worker line_buffering = False 894*cda5da8dSAndroid Build Coastguard Worker 895*cda5da8dSAndroid Build Coastguard Worker if process_group is None: 896*cda5da8dSAndroid Build Coastguard Worker process_group = -1 # The internal APIs are int-only 897*cda5da8dSAndroid Build Coastguard Worker 898*cda5da8dSAndroid Build Coastguard Worker gid = None 899*cda5da8dSAndroid Build Coastguard Worker if group is not None: 900*cda5da8dSAndroid Build Coastguard Worker if not hasattr(os, 'setregid'): 901*cda5da8dSAndroid Build Coastguard Worker raise ValueError("The 'group' parameter is not supported on the " 902*cda5da8dSAndroid Build Coastguard Worker "current platform") 903*cda5da8dSAndroid Build Coastguard Worker 904*cda5da8dSAndroid Build Coastguard Worker elif isinstance(group, str): 905*cda5da8dSAndroid Build Coastguard Worker try: 906*cda5da8dSAndroid Build Coastguard Worker import grp 907*cda5da8dSAndroid Build Coastguard Worker except ImportError: 908*cda5da8dSAndroid Build Coastguard Worker raise ValueError("The group parameter cannot be a string " 909*cda5da8dSAndroid Build Coastguard Worker "on systems without the grp module") 910*cda5da8dSAndroid Build Coastguard Worker 911*cda5da8dSAndroid Build Coastguard Worker gid = grp.getgrnam(group).gr_gid 912*cda5da8dSAndroid Build Coastguard Worker elif isinstance(group, int): 913*cda5da8dSAndroid Build Coastguard Worker gid = group 914*cda5da8dSAndroid Build Coastguard Worker else: 915*cda5da8dSAndroid Build Coastguard Worker raise TypeError("Group must be a string or an integer, not {}" 916*cda5da8dSAndroid Build Coastguard Worker .format(type(group))) 917*cda5da8dSAndroid Build Coastguard Worker 918*cda5da8dSAndroid Build Coastguard Worker if gid < 0: 919*cda5da8dSAndroid Build Coastguard Worker raise ValueError(f"Group ID cannot be negative, got {gid}") 920*cda5da8dSAndroid Build Coastguard Worker 921*cda5da8dSAndroid Build Coastguard Worker gids = None 922*cda5da8dSAndroid Build Coastguard Worker if extra_groups is not None: 923*cda5da8dSAndroid Build Coastguard Worker if not hasattr(os, 'setgroups'): 924*cda5da8dSAndroid Build Coastguard Worker raise ValueError("The 'extra_groups' parameter is not " 925*cda5da8dSAndroid Build Coastguard Worker "supported on the current platform") 926*cda5da8dSAndroid Build Coastguard Worker 927*cda5da8dSAndroid Build Coastguard Worker elif isinstance(extra_groups, str): 928*cda5da8dSAndroid Build Coastguard Worker raise ValueError("Groups must be a list, not a string") 929*cda5da8dSAndroid Build Coastguard Worker 930*cda5da8dSAndroid Build Coastguard Worker gids = [] 931*cda5da8dSAndroid Build Coastguard Worker for extra_group in extra_groups: 932*cda5da8dSAndroid Build Coastguard Worker if isinstance(extra_group, str): 933*cda5da8dSAndroid Build Coastguard Worker try: 934*cda5da8dSAndroid Build Coastguard Worker import grp 935*cda5da8dSAndroid Build Coastguard Worker except ImportError: 936*cda5da8dSAndroid Build Coastguard Worker raise ValueError("Items in extra_groups cannot be " 937*cda5da8dSAndroid Build Coastguard Worker "strings on systems without the " 938*cda5da8dSAndroid Build Coastguard Worker "grp module") 939*cda5da8dSAndroid Build Coastguard Worker 940*cda5da8dSAndroid Build Coastguard Worker gids.append(grp.getgrnam(extra_group).gr_gid) 941*cda5da8dSAndroid Build Coastguard Worker elif isinstance(extra_group, int): 942*cda5da8dSAndroid Build Coastguard Worker gids.append(extra_group) 943*cda5da8dSAndroid Build Coastguard Worker else: 944*cda5da8dSAndroid Build Coastguard Worker raise TypeError("Items in extra_groups must be a string " 945*cda5da8dSAndroid Build Coastguard Worker "or integer, not {}" 946*cda5da8dSAndroid Build Coastguard Worker .format(type(extra_group))) 947*cda5da8dSAndroid Build Coastguard Worker 948*cda5da8dSAndroid Build Coastguard Worker # make sure that the gids are all positive here so we can do less 949*cda5da8dSAndroid Build Coastguard Worker # checking in the C code 950*cda5da8dSAndroid Build Coastguard Worker for gid_check in gids: 951*cda5da8dSAndroid Build Coastguard Worker if gid_check < 0: 952*cda5da8dSAndroid Build Coastguard Worker raise ValueError(f"Group ID cannot be negative, got {gid_check}") 953*cda5da8dSAndroid Build Coastguard Worker 954*cda5da8dSAndroid Build Coastguard Worker uid = None 955*cda5da8dSAndroid Build Coastguard Worker if user is not None: 956*cda5da8dSAndroid Build Coastguard Worker if not hasattr(os, 'setreuid'): 957*cda5da8dSAndroid Build Coastguard Worker raise ValueError("The 'user' parameter is not supported on " 958*cda5da8dSAndroid Build Coastguard Worker "the current platform") 959*cda5da8dSAndroid Build Coastguard Worker 960*cda5da8dSAndroid Build Coastguard Worker elif isinstance(user, str): 961*cda5da8dSAndroid Build Coastguard Worker try: 962*cda5da8dSAndroid Build Coastguard Worker import pwd 963*cda5da8dSAndroid Build Coastguard Worker except ImportError: 964*cda5da8dSAndroid Build Coastguard Worker raise ValueError("The user parameter cannot be a string " 965*cda5da8dSAndroid Build Coastguard Worker "on systems without the pwd module") 966*cda5da8dSAndroid Build Coastguard Worker uid = pwd.getpwnam(user).pw_uid 967*cda5da8dSAndroid Build Coastguard Worker elif isinstance(user, int): 968*cda5da8dSAndroid Build Coastguard Worker uid = user 969*cda5da8dSAndroid Build Coastguard Worker else: 970*cda5da8dSAndroid Build Coastguard Worker raise TypeError("User must be a string or an integer") 971*cda5da8dSAndroid Build Coastguard Worker 972*cda5da8dSAndroid Build Coastguard Worker if uid < 0: 973*cda5da8dSAndroid Build Coastguard Worker raise ValueError(f"User ID cannot be negative, got {uid}") 974*cda5da8dSAndroid Build Coastguard Worker 975*cda5da8dSAndroid Build Coastguard Worker # Input and output objects. The general principle is like 976*cda5da8dSAndroid Build Coastguard Worker # this: 977*cda5da8dSAndroid Build Coastguard Worker # 978*cda5da8dSAndroid Build Coastguard Worker # Parent Child 979*cda5da8dSAndroid Build Coastguard Worker # ------ ----- 980*cda5da8dSAndroid Build Coastguard Worker # p2cwrite ---stdin---> p2cread 981*cda5da8dSAndroid Build Coastguard Worker # c2pread <--stdout--- c2pwrite 982*cda5da8dSAndroid Build Coastguard Worker # errread <--stderr--- errwrite 983*cda5da8dSAndroid Build Coastguard Worker # 984*cda5da8dSAndroid Build Coastguard Worker # On POSIX, the child objects are file descriptors. On 985*cda5da8dSAndroid Build Coastguard Worker # Windows, these are Windows file handles. The parent objects 986*cda5da8dSAndroid Build Coastguard Worker # are file descriptors on both platforms. The parent objects 987*cda5da8dSAndroid Build Coastguard Worker # are -1 when not using PIPEs. The child objects are -1 988*cda5da8dSAndroid Build Coastguard Worker # when not redirecting. 989*cda5da8dSAndroid Build Coastguard Worker 990*cda5da8dSAndroid Build Coastguard Worker (p2cread, p2cwrite, 991*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 992*cda5da8dSAndroid Build Coastguard Worker errread, errwrite) = self._get_handles(stdin, stdout, stderr) 993*cda5da8dSAndroid Build Coastguard Worker 994*cda5da8dSAndroid Build Coastguard Worker # From here on, raising exceptions may cause file descriptor leakage 995*cda5da8dSAndroid Build Coastguard Worker 996*cda5da8dSAndroid Build Coastguard Worker # We wrap OS handles *before* launching the child, otherwise a 997*cda5da8dSAndroid Build Coastguard Worker # quickly terminating child could make our fds unwrappable 998*cda5da8dSAndroid Build Coastguard Worker # (see #8458). 999*cda5da8dSAndroid Build Coastguard Worker 1000*cda5da8dSAndroid Build Coastguard Worker if _mswindows: 1001*cda5da8dSAndroid Build Coastguard Worker if p2cwrite != -1: 1002*cda5da8dSAndroid Build Coastguard Worker p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0) 1003*cda5da8dSAndroid Build Coastguard Worker if c2pread != -1: 1004*cda5da8dSAndroid Build Coastguard Worker c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0) 1005*cda5da8dSAndroid Build Coastguard Worker if errread != -1: 1006*cda5da8dSAndroid Build Coastguard Worker errread = msvcrt.open_osfhandle(errread.Detach(), 0) 1007*cda5da8dSAndroid Build Coastguard Worker 1008*cda5da8dSAndroid Build Coastguard Worker try: 1009*cda5da8dSAndroid Build Coastguard Worker if p2cwrite != -1: 1010*cda5da8dSAndroid Build Coastguard Worker self.stdin = io.open(p2cwrite, 'wb', bufsize) 1011*cda5da8dSAndroid Build Coastguard Worker if self.text_mode: 1012*cda5da8dSAndroid Build Coastguard Worker self.stdin = io.TextIOWrapper(self.stdin, write_through=True, 1013*cda5da8dSAndroid Build Coastguard Worker line_buffering=line_buffering, 1014*cda5da8dSAndroid Build Coastguard Worker encoding=encoding, errors=errors) 1015*cda5da8dSAndroid Build Coastguard Worker if c2pread != -1: 1016*cda5da8dSAndroid Build Coastguard Worker self.stdout = io.open(c2pread, 'rb', bufsize) 1017*cda5da8dSAndroid Build Coastguard Worker if self.text_mode: 1018*cda5da8dSAndroid Build Coastguard Worker self.stdout = io.TextIOWrapper(self.stdout, 1019*cda5da8dSAndroid Build Coastguard Worker encoding=encoding, errors=errors) 1020*cda5da8dSAndroid Build Coastguard Worker if errread != -1: 1021*cda5da8dSAndroid Build Coastguard Worker self.stderr = io.open(errread, 'rb', bufsize) 1022*cda5da8dSAndroid Build Coastguard Worker if self.text_mode: 1023*cda5da8dSAndroid Build Coastguard Worker self.stderr = io.TextIOWrapper(self.stderr, 1024*cda5da8dSAndroid Build Coastguard Worker encoding=encoding, errors=errors) 1025*cda5da8dSAndroid Build Coastguard Worker 1026*cda5da8dSAndroid Build Coastguard Worker self._execute_child(args, executable, preexec_fn, close_fds, 1027*cda5da8dSAndroid Build Coastguard Worker pass_fds, cwd, env, 1028*cda5da8dSAndroid Build Coastguard Worker startupinfo, creationflags, shell, 1029*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite, 1030*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 1031*cda5da8dSAndroid Build Coastguard Worker errread, errwrite, 1032*cda5da8dSAndroid Build Coastguard Worker restore_signals, 1033*cda5da8dSAndroid Build Coastguard Worker gid, gids, uid, umask, 1034*cda5da8dSAndroid Build Coastguard Worker start_new_session, process_group) 1035*cda5da8dSAndroid Build Coastguard Worker except: 1036*cda5da8dSAndroid Build Coastguard Worker # Cleanup if the child failed starting. 1037*cda5da8dSAndroid Build Coastguard Worker for f in filter(None, (self.stdin, self.stdout, self.stderr)): 1038*cda5da8dSAndroid Build Coastguard Worker try: 1039*cda5da8dSAndroid Build Coastguard Worker f.close() 1040*cda5da8dSAndroid Build Coastguard Worker except OSError: 1041*cda5da8dSAndroid Build Coastguard Worker pass # Ignore EBADF or other errors. 1042*cda5da8dSAndroid Build Coastguard Worker 1043*cda5da8dSAndroid Build Coastguard Worker if not self._closed_child_pipe_fds: 1044*cda5da8dSAndroid Build Coastguard Worker to_close = [] 1045*cda5da8dSAndroid Build Coastguard Worker if stdin == PIPE: 1046*cda5da8dSAndroid Build Coastguard Worker to_close.append(p2cread) 1047*cda5da8dSAndroid Build Coastguard Worker if stdout == PIPE: 1048*cda5da8dSAndroid Build Coastguard Worker to_close.append(c2pwrite) 1049*cda5da8dSAndroid Build Coastguard Worker if stderr == PIPE: 1050*cda5da8dSAndroid Build Coastguard Worker to_close.append(errwrite) 1051*cda5da8dSAndroid Build Coastguard Worker if hasattr(self, '_devnull'): 1052*cda5da8dSAndroid Build Coastguard Worker to_close.append(self._devnull) 1053*cda5da8dSAndroid Build Coastguard Worker for fd in to_close: 1054*cda5da8dSAndroid Build Coastguard Worker try: 1055*cda5da8dSAndroid Build Coastguard Worker if _mswindows and isinstance(fd, Handle): 1056*cda5da8dSAndroid Build Coastguard Worker fd.Close() 1057*cda5da8dSAndroid Build Coastguard Worker else: 1058*cda5da8dSAndroid Build Coastguard Worker os.close(fd) 1059*cda5da8dSAndroid Build Coastguard Worker except OSError: 1060*cda5da8dSAndroid Build Coastguard Worker pass 1061*cda5da8dSAndroid Build Coastguard Worker 1062*cda5da8dSAndroid Build Coastguard Worker raise 1063*cda5da8dSAndroid Build Coastguard Worker 1064*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 1065*cda5da8dSAndroid Build Coastguard Worker obj_repr = ( 1066*cda5da8dSAndroid Build Coastguard Worker f"<{self.__class__.__name__}: " 1067*cda5da8dSAndroid Build Coastguard Worker f"returncode: {self.returncode} args: {self.args!r}>" 1068*cda5da8dSAndroid Build Coastguard Worker ) 1069*cda5da8dSAndroid Build Coastguard Worker if len(obj_repr) > 80: 1070*cda5da8dSAndroid Build Coastguard Worker obj_repr = obj_repr[:76] + "...>" 1071*cda5da8dSAndroid Build Coastguard Worker return obj_repr 1072*cda5da8dSAndroid Build Coastguard Worker 1073*cda5da8dSAndroid Build Coastguard Worker __class_getitem__ = classmethod(types.GenericAlias) 1074*cda5da8dSAndroid Build Coastguard Worker 1075*cda5da8dSAndroid Build Coastguard Worker @property 1076*cda5da8dSAndroid Build Coastguard Worker def universal_newlines(self): 1077*cda5da8dSAndroid Build Coastguard Worker # universal_newlines as retained as an alias of text_mode for API 1078*cda5da8dSAndroid Build Coastguard Worker # compatibility. bpo-31756 1079*cda5da8dSAndroid Build Coastguard Worker return self.text_mode 1080*cda5da8dSAndroid Build Coastguard Worker 1081*cda5da8dSAndroid Build Coastguard Worker @universal_newlines.setter 1082*cda5da8dSAndroid Build Coastguard Worker def universal_newlines(self, universal_newlines): 1083*cda5da8dSAndroid Build Coastguard Worker self.text_mode = bool(universal_newlines) 1084*cda5da8dSAndroid Build Coastguard Worker 1085*cda5da8dSAndroid Build Coastguard Worker def _translate_newlines(self, data, encoding, errors): 1086*cda5da8dSAndroid Build Coastguard Worker data = data.decode(encoding, errors) 1087*cda5da8dSAndroid Build Coastguard Worker return data.replace("\r\n", "\n").replace("\r", "\n") 1088*cda5da8dSAndroid Build Coastguard Worker 1089*cda5da8dSAndroid Build Coastguard Worker def __enter__(self): 1090*cda5da8dSAndroid Build Coastguard Worker return self 1091*cda5da8dSAndroid Build Coastguard Worker 1092*cda5da8dSAndroid Build Coastguard Worker def __exit__(self, exc_type, value, traceback): 1093*cda5da8dSAndroid Build Coastguard Worker if self.stdout: 1094*cda5da8dSAndroid Build Coastguard Worker self.stdout.close() 1095*cda5da8dSAndroid Build Coastguard Worker if self.stderr: 1096*cda5da8dSAndroid Build Coastguard Worker self.stderr.close() 1097*cda5da8dSAndroid Build Coastguard Worker try: # Flushing a BufferedWriter may raise an error 1098*cda5da8dSAndroid Build Coastguard Worker if self.stdin: 1099*cda5da8dSAndroid Build Coastguard Worker self.stdin.close() 1100*cda5da8dSAndroid Build Coastguard Worker finally: 1101*cda5da8dSAndroid Build Coastguard Worker if exc_type == KeyboardInterrupt: 1102*cda5da8dSAndroid Build Coastguard Worker # https://bugs.python.org/issue25942 1103*cda5da8dSAndroid Build Coastguard Worker # In the case of a KeyboardInterrupt we assume the SIGINT 1104*cda5da8dSAndroid Build Coastguard Worker # was also already sent to our child processes. We can't 1105*cda5da8dSAndroid Build Coastguard Worker # block indefinitely as that is not user friendly. 1106*cda5da8dSAndroid Build Coastguard Worker # If we have not already waited a brief amount of time in 1107*cda5da8dSAndroid Build Coastguard Worker # an interrupted .wait() or .communicate() call, do so here 1108*cda5da8dSAndroid Build Coastguard Worker # for consistency. 1109*cda5da8dSAndroid Build Coastguard Worker if self._sigint_wait_secs > 0: 1110*cda5da8dSAndroid Build Coastguard Worker try: 1111*cda5da8dSAndroid Build Coastguard Worker self._wait(timeout=self._sigint_wait_secs) 1112*cda5da8dSAndroid Build Coastguard Worker except TimeoutExpired: 1113*cda5da8dSAndroid Build Coastguard Worker pass 1114*cda5da8dSAndroid Build Coastguard Worker self._sigint_wait_secs = 0 # Note that this has been done. 1115*cda5da8dSAndroid Build Coastguard Worker return # resume the KeyboardInterrupt 1116*cda5da8dSAndroid Build Coastguard Worker 1117*cda5da8dSAndroid Build Coastguard Worker # Wait for the process to terminate, to avoid zombies. 1118*cda5da8dSAndroid Build Coastguard Worker self.wait() 1119*cda5da8dSAndroid Build Coastguard Worker 1120*cda5da8dSAndroid Build Coastguard Worker def __del__(self, _maxsize=sys.maxsize, _warn=warnings.warn): 1121*cda5da8dSAndroid Build Coastguard Worker if not self._child_created: 1122*cda5da8dSAndroid Build Coastguard Worker # We didn't get to successfully create a child process. 1123*cda5da8dSAndroid Build Coastguard Worker return 1124*cda5da8dSAndroid Build Coastguard Worker if self.returncode is None: 1125*cda5da8dSAndroid Build Coastguard Worker # Not reading subprocess exit status creates a zombie process which 1126*cda5da8dSAndroid Build Coastguard Worker # is only destroyed at the parent python process exit 1127*cda5da8dSAndroid Build Coastguard Worker _warn("subprocess %s is still running" % self.pid, 1128*cda5da8dSAndroid Build Coastguard Worker ResourceWarning, source=self) 1129*cda5da8dSAndroid Build Coastguard Worker # In case the child hasn't been waited on, check if it's done. 1130*cda5da8dSAndroid Build Coastguard Worker self._internal_poll(_deadstate=_maxsize) 1131*cda5da8dSAndroid Build Coastguard Worker if self.returncode is None and _active is not None: 1132*cda5da8dSAndroid Build Coastguard Worker # Child is still running, keep us alive until we can wait on it. 1133*cda5da8dSAndroid Build Coastguard Worker _active.append(self) 1134*cda5da8dSAndroid Build Coastguard Worker 1135*cda5da8dSAndroid Build Coastguard Worker def _get_devnull(self): 1136*cda5da8dSAndroid Build Coastguard Worker if not hasattr(self, '_devnull'): 1137*cda5da8dSAndroid Build Coastguard Worker self._devnull = os.open(os.devnull, os.O_RDWR) 1138*cda5da8dSAndroid Build Coastguard Worker return self._devnull 1139*cda5da8dSAndroid Build Coastguard Worker 1140*cda5da8dSAndroid Build Coastguard Worker def _stdin_write(self, input): 1141*cda5da8dSAndroid Build Coastguard Worker if input: 1142*cda5da8dSAndroid Build Coastguard Worker try: 1143*cda5da8dSAndroid Build Coastguard Worker self.stdin.write(input) 1144*cda5da8dSAndroid Build Coastguard Worker except BrokenPipeError: 1145*cda5da8dSAndroid Build Coastguard Worker pass # communicate() must ignore broken pipe errors. 1146*cda5da8dSAndroid Build Coastguard Worker except OSError as exc: 1147*cda5da8dSAndroid Build Coastguard Worker if exc.errno == errno.EINVAL: 1148*cda5da8dSAndroid Build Coastguard Worker # bpo-19612, bpo-30418: On Windows, stdin.write() fails 1149*cda5da8dSAndroid Build Coastguard Worker # with EINVAL if the child process exited or if the child 1150*cda5da8dSAndroid Build Coastguard Worker # process is still running but closed the pipe. 1151*cda5da8dSAndroid Build Coastguard Worker pass 1152*cda5da8dSAndroid Build Coastguard Worker else: 1153*cda5da8dSAndroid Build Coastguard Worker raise 1154*cda5da8dSAndroid Build Coastguard Worker 1155*cda5da8dSAndroid Build Coastguard Worker try: 1156*cda5da8dSAndroid Build Coastguard Worker self.stdin.close() 1157*cda5da8dSAndroid Build Coastguard Worker except BrokenPipeError: 1158*cda5da8dSAndroid Build Coastguard Worker pass # communicate() must ignore broken pipe errors. 1159*cda5da8dSAndroid Build Coastguard Worker except OSError as exc: 1160*cda5da8dSAndroid Build Coastguard Worker if exc.errno == errno.EINVAL: 1161*cda5da8dSAndroid Build Coastguard Worker pass 1162*cda5da8dSAndroid Build Coastguard Worker else: 1163*cda5da8dSAndroid Build Coastguard Worker raise 1164*cda5da8dSAndroid Build Coastguard Worker 1165*cda5da8dSAndroid Build Coastguard Worker def communicate(self, input=None, timeout=None): 1166*cda5da8dSAndroid Build Coastguard Worker """Interact with process: Send data to stdin and close it. 1167*cda5da8dSAndroid Build Coastguard Worker Read data from stdout and stderr, until end-of-file is 1168*cda5da8dSAndroid Build Coastguard Worker reached. Wait for process to terminate. 1169*cda5da8dSAndroid Build Coastguard Worker 1170*cda5da8dSAndroid Build Coastguard Worker The optional "input" argument should be data to be sent to the 1171*cda5da8dSAndroid Build Coastguard Worker child process, or None, if no data should be sent to the child. 1172*cda5da8dSAndroid Build Coastguard Worker communicate() returns a tuple (stdout, stderr). 1173*cda5da8dSAndroid Build Coastguard Worker 1174*cda5da8dSAndroid Build Coastguard Worker By default, all communication is in bytes, and therefore any 1175*cda5da8dSAndroid Build Coastguard Worker "input" should be bytes, and the (stdout, stderr) will be bytes. 1176*cda5da8dSAndroid Build Coastguard Worker If in text mode (indicated by self.text_mode), any "input" should 1177*cda5da8dSAndroid Build Coastguard Worker be a string, and (stdout, stderr) will be strings decoded 1178*cda5da8dSAndroid Build Coastguard Worker according to locale encoding, or by "encoding" if set. Text mode 1179*cda5da8dSAndroid Build Coastguard Worker is triggered by setting any of text, encoding, errors or 1180*cda5da8dSAndroid Build Coastguard Worker universal_newlines. 1181*cda5da8dSAndroid Build Coastguard Worker """ 1182*cda5da8dSAndroid Build Coastguard Worker 1183*cda5da8dSAndroid Build Coastguard Worker if self._communication_started and input: 1184*cda5da8dSAndroid Build Coastguard Worker raise ValueError("Cannot send input after starting communication") 1185*cda5da8dSAndroid Build Coastguard Worker 1186*cda5da8dSAndroid Build Coastguard Worker # Optimization: If we are not worried about timeouts, we haven't 1187*cda5da8dSAndroid Build Coastguard Worker # started communicating, and we have one or zero pipes, using select() 1188*cda5da8dSAndroid Build Coastguard Worker # or threads is unnecessary. 1189*cda5da8dSAndroid Build Coastguard Worker if (timeout is None and not self._communication_started and 1190*cda5da8dSAndroid Build Coastguard Worker [self.stdin, self.stdout, self.stderr].count(None) >= 2): 1191*cda5da8dSAndroid Build Coastguard Worker stdout = None 1192*cda5da8dSAndroid Build Coastguard Worker stderr = None 1193*cda5da8dSAndroid Build Coastguard Worker if self.stdin: 1194*cda5da8dSAndroid Build Coastguard Worker self._stdin_write(input) 1195*cda5da8dSAndroid Build Coastguard Worker elif self.stdout: 1196*cda5da8dSAndroid Build Coastguard Worker stdout = self.stdout.read() 1197*cda5da8dSAndroid Build Coastguard Worker self.stdout.close() 1198*cda5da8dSAndroid Build Coastguard Worker elif self.stderr: 1199*cda5da8dSAndroid Build Coastguard Worker stderr = self.stderr.read() 1200*cda5da8dSAndroid Build Coastguard Worker self.stderr.close() 1201*cda5da8dSAndroid Build Coastguard Worker self.wait() 1202*cda5da8dSAndroid Build Coastguard Worker else: 1203*cda5da8dSAndroid Build Coastguard Worker if timeout is not None: 1204*cda5da8dSAndroid Build Coastguard Worker endtime = _time() + timeout 1205*cda5da8dSAndroid Build Coastguard Worker else: 1206*cda5da8dSAndroid Build Coastguard Worker endtime = None 1207*cda5da8dSAndroid Build Coastguard Worker 1208*cda5da8dSAndroid Build Coastguard Worker try: 1209*cda5da8dSAndroid Build Coastguard Worker stdout, stderr = self._communicate(input, endtime, timeout) 1210*cda5da8dSAndroid Build Coastguard Worker except KeyboardInterrupt: 1211*cda5da8dSAndroid Build Coastguard Worker # https://bugs.python.org/issue25942 1212*cda5da8dSAndroid Build Coastguard Worker # See the detailed comment in .wait(). 1213*cda5da8dSAndroid Build Coastguard Worker if timeout is not None: 1214*cda5da8dSAndroid Build Coastguard Worker sigint_timeout = min(self._sigint_wait_secs, 1215*cda5da8dSAndroid Build Coastguard Worker self._remaining_time(endtime)) 1216*cda5da8dSAndroid Build Coastguard Worker else: 1217*cda5da8dSAndroid Build Coastguard Worker sigint_timeout = self._sigint_wait_secs 1218*cda5da8dSAndroid Build Coastguard Worker self._sigint_wait_secs = 0 # nothing else should wait. 1219*cda5da8dSAndroid Build Coastguard Worker try: 1220*cda5da8dSAndroid Build Coastguard Worker self._wait(timeout=sigint_timeout) 1221*cda5da8dSAndroid Build Coastguard Worker except TimeoutExpired: 1222*cda5da8dSAndroid Build Coastguard Worker pass 1223*cda5da8dSAndroid Build Coastguard Worker raise # resume the KeyboardInterrupt 1224*cda5da8dSAndroid Build Coastguard Worker 1225*cda5da8dSAndroid Build Coastguard Worker finally: 1226*cda5da8dSAndroid Build Coastguard Worker self._communication_started = True 1227*cda5da8dSAndroid Build Coastguard Worker 1228*cda5da8dSAndroid Build Coastguard Worker sts = self.wait(timeout=self._remaining_time(endtime)) 1229*cda5da8dSAndroid Build Coastguard Worker 1230*cda5da8dSAndroid Build Coastguard Worker return (stdout, stderr) 1231*cda5da8dSAndroid Build Coastguard Worker 1232*cda5da8dSAndroid Build Coastguard Worker 1233*cda5da8dSAndroid Build Coastguard Worker def poll(self): 1234*cda5da8dSAndroid Build Coastguard Worker """Check if child process has terminated. Set and return returncode 1235*cda5da8dSAndroid Build Coastguard Worker attribute.""" 1236*cda5da8dSAndroid Build Coastguard Worker return self._internal_poll() 1237*cda5da8dSAndroid Build Coastguard Worker 1238*cda5da8dSAndroid Build Coastguard Worker 1239*cda5da8dSAndroid Build Coastguard Worker def _remaining_time(self, endtime): 1240*cda5da8dSAndroid Build Coastguard Worker """Convenience for _communicate when computing timeouts.""" 1241*cda5da8dSAndroid Build Coastguard Worker if endtime is None: 1242*cda5da8dSAndroid Build Coastguard Worker return None 1243*cda5da8dSAndroid Build Coastguard Worker else: 1244*cda5da8dSAndroid Build Coastguard Worker return endtime - _time() 1245*cda5da8dSAndroid Build Coastguard Worker 1246*cda5da8dSAndroid Build Coastguard Worker 1247*cda5da8dSAndroid Build Coastguard Worker def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq, 1248*cda5da8dSAndroid Build Coastguard Worker skip_check_and_raise=False): 1249*cda5da8dSAndroid Build Coastguard Worker """Convenience for checking if a timeout has expired.""" 1250*cda5da8dSAndroid Build Coastguard Worker if endtime is None: 1251*cda5da8dSAndroid Build Coastguard Worker return 1252*cda5da8dSAndroid Build Coastguard Worker if skip_check_and_raise or _time() > endtime: 1253*cda5da8dSAndroid Build Coastguard Worker raise TimeoutExpired( 1254*cda5da8dSAndroid Build Coastguard Worker self.args, orig_timeout, 1255*cda5da8dSAndroid Build Coastguard Worker output=b''.join(stdout_seq) if stdout_seq else None, 1256*cda5da8dSAndroid Build Coastguard Worker stderr=b''.join(stderr_seq) if stderr_seq else None) 1257*cda5da8dSAndroid Build Coastguard Worker 1258*cda5da8dSAndroid Build Coastguard Worker 1259*cda5da8dSAndroid Build Coastguard Worker def wait(self, timeout=None): 1260*cda5da8dSAndroid Build Coastguard Worker """Wait for child process to terminate; returns self.returncode.""" 1261*cda5da8dSAndroid Build Coastguard Worker if timeout is not None: 1262*cda5da8dSAndroid Build Coastguard Worker endtime = _time() + timeout 1263*cda5da8dSAndroid Build Coastguard Worker try: 1264*cda5da8dSAndroid Build Coastguard Worker return self._wait(timeout=timeout) 1265*cda5da8dSAndroid Build Coastguard Worker except KeyboardInterrupt: 1266*cda5da8dSAndroid Build Coastguard Worker # https://bugs.python.org/issue25942 1267*cda5da8dSAndroid Build Coastguard Worker # The first keyboard interrupt waits briefly for the child to 1268*cda5da8dSAndroid Build Coastguard Worker # exit under the common assumption that it also received the ^C 1269*cda5da8dSAndroid Build Coastguard Worker # generated SIGINT and will exit rapidly. 1270*cda5da8dSAndroid Build Coastguard Worker if timeout is not None: 1271*cda5da8dSAndroid Build Coastguard Worker sigint_timeout = min(self._sigint_wait_secs, 1272*cda5da8dSAndroid Build Coastguard Worker self._remaining_time(endtime)) 1273*cda5da8dSAndroid Build Coastguard Worker else: 1274*cda5da8dSAndroid Build Coastguard Worker sigint_timeout = self._sigint_wait_secs 1275*cda5da8dSAndroid Build Coastguard Worker self._sigint_wait_secs = 0 # nothing else should wait. 1276*cda5da8dSAndroid Build Coastguard Worker try: 1277*cda5da8dSAndroid Build Coastguard Worker self._wait(timeout=sigint_timeout) 1278*cda5da8dSAndroid Build Coastguard Worker except TimeoutExpired: 1279*cda5da8dSAndroid Build Coastguard Worker pass 1280*cda5da8dSAndroid Build Coastguard Worker raise # resume the KeyboardInterrupt 1281*cda5da8dSAndroid Build Coastguard Worker 1282*cda5da8dSAndroid Build Coastguard Worker def _close_pipe_fds(self, 1283*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite, 1284*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 1285*cda5da8dSAndroid Build Coastguard Worker errread, errwrite): 1286*cda5da8dSAndroid Build Coastguard Worker # self._devnull is not always defined. 1287*cda5da8dSAndroid Build Coastguard Worker devnull_fd = getattr(self, '_devnull', None) 1288*cda5da8dSAndroid Build Coastguard Worker 1289*cda5da8dSAndroid Build Coastguard Worker with contextlib.ExitStack() as stack: 1290*cda5da8dSAndroid Build Coastguard Worker if _mswindows: 1291*cda5da8dSAndroid Build Coastguard Worker if p2cread != -1: 1292*cda5da8dSAndroid Build Coastguard Worker stack.callback(p2cread.Close) 1293*cda5da8dSAndroid Build Coastguard Worker if c2pwrite != -1: 1294*cda5da8dSAndroid Build Coastguard Worker stack.callback(c2pwrite.Close) 1295*cda5da8dSAndroid Build Coastguard Worker if errwrite != -1: 1296*cda5da8dSAndroid Build Coastguard Worker stack.callback(errwrite.Close) 1297*cda5da8dSAndroid Build Coastguard Worker else: 1298*cda5da8dSAndroid Build Coastguard Worker if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd: 1299*cda5da8dSAndroid Build Coastguard Worker stack.callback(os.close, p2cread) 1300*cda5da8dSAndroid Build Coastguard Worker if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd: 1301*cda5da8dSAndroid Build Coastguard Worker stack.callback(os.close, c2pwrite) 1302*cda5da8dSAndroid Build Coastguard Worker if errwrite != -1 and errread != -1 and errwrite != devnull_fd: 1303*cda5da8dSAndroid Build Coastguard Worker stack.callback(os.close, errwrite) 1304*cda5da8dSAndroid Build Coastguard Worker 1305*cda5da8dSAndroid Build Coastguard Worker if devnull_fd is not None: 1306*cda5da8dSAndroid Build Coastguard Worker stack.callback(os.close, devnull_fd) 1307*cda5da8dSAndroid Build Coastguard Worker 1308*cda5da8dSAndroid Build Coastguard Worker # Prevent a double close of these handles/fds from __init__ on error. 1309*cda5da8dSAndroid Build Coastguard Worker self._closed_child_pipe_fds = True 1310*cda5da8dSAndroid Build Coastguard Worker 1311*cda5da8dSAndroid Build Coastguard Worker @contextlib.contextmanager 1312*cda5da8dSAndroid Build Coastguard Worker def _on_error_fd_closer(self): 1313*cda5da8dSAndroid Build Coastguard Worker """Helper to ensure file descriptors opened in _get_handles are closed""" 1314*cda5da8dSAndroid Build Coastguard Worker to_close = [] 1315*cda5da8dSAndroid Build Coastguard Worker try: 1316*cda5da8dSAndroid Build Coastguard Worker yield to_close 1317*cda5da8dSAndroid Build Coastguard Worker except: 1318*cda5da8dSAndroid Build Coastguard Worker if hasattr(self, '_devnull'): 1319*cda5da8dSAndroid Build Coastguard Worker to_close.append(self._devnull) 1320*cda5da8dSAndroid Build Coastguard Worker del self._devnull 1321*cda5da8dSAndroid Build Coastguard Worker for fd in to_close: 1322*cda5da8dSAndroid Build Coastguard Worker try: 1323*cda5da8dSAndroid Build Coastguard Worker if _mswindows and isinstance(fd, Handle): 1324*cda5da8dSAndroid Build Coastguard Worker fd.Close() 1325*cda5da8dSAndroid Build Coastguard Worker else: 1326*cda5da8dSAndroid Build Coastguard Worker os.close(fd) 1327*cda5da8dSAndroid Build Coastguard Worker except OSError: 1328*cda5da8dSAndroid Build Coastguard Worker pass 1329*cda5da8dSAndroid Build Coastguard Worker raise 1330*cda5da8dSAndroid Build Coastguard Worker 1331*cda5da8dSAndroid Build Coastguard Worker if _mswindows: 1332*cda5da8dSAndroid Build Coastguard Worker # 1333*cda5da8dSAndroid Build Coastguard Worker # Windows methods 1334*cda5da8dSAndroid Build Coastguard Worker # 1335*cda5da8dSAndroid Build Coastguard Worker def _get_handles(self, stdin, stdout, stderr): 1336*cda5da8dSAndroid Build Coastguard Worker """Construct and return tuple with IO objects: 1337*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite 1338*cda5da8dSAndroid Build Coastguard Worker """ 1339*cda5da8dSAndroid Build Coastguard Worker if stdin is None and stdout is None and stderr is None: 1340*cda5da8dSAndroid Build Coastguard Worker return (-1, -1, -1, -1, -1, -1) 1341*cda5da8dSAndroid Build Coastguard Worker 1342*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite = -1, -1 1343*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite = -1, -1 1344*cda5da8dSAndroid Build Coastguard Worker errread, errwrite = -1, -1 1345*cda5da8dSAndroid Build Coastguard Worker 1346*cda5da8dSAndroid Build Coastguard Worker with self._on_error_fd_closer() as err_close_fds: 1347*cda5da8dSAndroid Build Coastguard Worker if stdin is None: 1348*cda5da8dSAndroid Build Coastguard Worker p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE) 1349*cda5da8dSAndroid Build Coastguard Worker if p2cread is None: 1350*cda5da8dSAndroid Build Coastguard Worker p2cread, _ = _winapi.CreatePipe(None, 0) 1351*cda5da8dSAndroid Build Coastguard Worker p2cread = Handle(p2cread) 1352*cda5da8dSAndroid Build Coastguard Worker err_close_fds.append(p2cread) 1353*cda5da8dSAndroid Build Coastguard Worker _winapi.CloseHandle(_) 1354*cda5da8dSAndroid Build Coastguard Worker elif stdin == PIPE: 1355*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite = _winapi.CreatePipe(None, 0) 1356*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite) 1357*cda5da8dSAndroid Build Coastguard Worker err_close_fds.extend((p2cread, p2cwrite)) 1358*cda5da8dSAndroid Build Coastguard Worker elif stdin == DEVNULL: 1359*cda5da8dSAndroid Build Coastguard Worker p2cread = msvcrt.get_osfhandle(self._get_devnull()) 1360*cda5da8dSAndroid Build Coastguard Worker elif isinstance(stdin, int): 1361*cda5da8dSAndroid Build Coastguard Worker p2cread = msvcrt.get_osfhandle(stdin) 1362*cda5da8dSAndroid Build Coastguard Worker else: 1363*cda5da8dSAndroid Build Coastguard Worker # Assuming file-like object 1364*cda5da8dSAndroid Build Coastguard Worker p2cread = msvcrt.get_osfhandle(stdin.fileno()) 1365*cda5da8dSAndroid Build Coastguard Worker p2cread = self._make_inheritable(p2cread) 1366*cda5da8dSAndroid Build Coastguard Worker 1367*cda5da8dSAndroid Build Coastguard Worker if stdout is None: 1368*cda5da8dSAndroid Build Coastguard Worker c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE) 1369*cda5da8dSAndroid Build Coastguard Worker if c2pwrite is None: 1370*cda5da8dSAndroid Build Coastguard Worker _, c2pwrite = _winapi.CreatePipe(None, 0) 1371*cda5da8dSAndroid Build Coastguard Worker c2pwrite = Handle(c2pwrite) 1372*cda5da8dSAndroid Build Coastguard Worker err_close_fds.append(c2pwrite) 1373*cda5da8dSAndroid Build Coastguard Worker _winapi.CloseHandle(_) 1374*cda5da8dSAndroid Build Coastguard Worker elif stdout == PIPE: 1375*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite = _winapi.CreatePipe(None, 0) 1376*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite) 1377*cda5da8dSAndroid Build Coastguard Worker err_close_fds.extend((c2pread, c2pwrite)) 1378*cda5da8dSAndroid Build Coastguard Worker elif stdout == DEVNULL: 1379*cda5da8dSAndroid Build Coastguard Worker c2pwrite = msvcrt.get_osfhandle(self._get_devnull()) 1380*cda5da8dSAndroid Build Coastguard Worker elif isinstance(stdout, int): 1381*cda5da8dSAndroid Build Coastguard Worker c2pwrite = msvcrt.get_osfhandle(stdout) 1382*cda5da8dSAndroid Build Coastguard Worker else: 1383*cda5da8dSAndroid Build Coastguard Worker # Assuming file-like object 1384*cda5da8dSAndroid Build Coastguard Worker c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) 1385*cda5da8dSAndroid Build Coastguard Worker c2pwrite = self._make_inheritable(c2pwrite) 1386*cda5da8dSAndroid Build Coastguard Worker 1387*cda5da8dSAndroid Build Coastguard Worker if stderr is None: 1388*cda5da8dSAndroid Build Coastguard Worker errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE) 1389*cda5da8dSAndroid Build Coastguard Worker if errwrite is None: 1390*cda5da8dSAndroid Build Coastguard Worker _, errwrite = _winapi.CreatePipe(None, 0) 1391*cda5da8dSAndroid Build Coastguard Worker errwrite = Handle(errwrite) 1392*cda5da8dSAndroid Build Coastguard Worker err_close_fds.append(errwrite) 1393*cda5da8dSAndroid Build Coastguard Worker _winapi.CloseHandle(_) 1394*cda5da8dSAndroid Build Coastguard Worker elif stderr == PIPE: 1395*cda5da8dSAndroid Build Coastguard Worker errread, errwrite = _winapi.CreatePipe(None, 0) 1396*cda5da8dSAndroid Build Coastguard Worker errread, errwrite = Handle(errread), Handle(errwrite) 1397*cda5da8dSAndroid Build Coastguard Worker err_close_fds.extend((errread, errwrite)) 1398*cda5da8dSAndroid Build Coastguard Worker elif stderr == STDOUT: 1399*cda5da8dSAndroid Build Coastguard Worker errwrite = c2pwrite 1400*cda5da8dSAndroid Build Coastguard Worker elif stderr == DEVNULL: 1401*cda5da8dSAndroid Build Coastguard Worker errwrite = msvcrt.get_osfhandle(self._get_devnull()) 1402*cda5da8dSAndroid Build Coastguard Worker elif isinstance(stderr, int): 1403*cda5da8dSAndroid Build Coastguard Worker errwrite = msvcrt.get_osfhandle(stderr) 1404*cda5da8dSAndroid Build Coastguard Worker else: 1405*cda5da8dSAndroid Build Coastguard Worker # Assuming file-like object 1406*cda5da8dSAndroid Build Coastguard Worker errwrite = msvcrt.get_osfhandle(stderr.fileno()) 1407*cda5da8dSAndroid Build Coastguard Worker errwrite = self._make_inheritable(errwrite) 1408*cda5da8dSAndroid Build Coastguard Worker 1409*cda5da8dSAndroid Build Coastguard Worker return (p2cread, p2cwrite, 1410*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 1411*cda5da8dSAndroid Build Coastguard Worker errread, errwrite) 1412*cda5da8dSAndroid Build Coastguard Worker 1413*cda5da8dSAndroid Build Coastguard Worker 1414*cda5da8dSAndroid Build Coastguard Worker def _make_inheritable(self, handle): 1415*cda5da8dSAndroid Build Coastguard Worker """Return a duplicate of handle, which is inheritable""" 1416*cda5da8dSAndroid Build Coastguard Worker h = _winapi.DuplicateHandle( 1417*cda5da8dSAndroid Build Coastguard Worker _winapi.GetCurrentProcess(), handle, 1418*cda5da8dSAndroid Build Coastguard Worker _winapi.GetCurrentProcess(), 0, 1, 1419*cda5da8dSAndroid Build Coastguard Worker _winapi.DUPLICATE_SAME_ACCESS) 1420*cda5da8dSAndroid Build Coastguard Worker return Handle(h) 1421*cda5da8dSAndroid Build Coastguard Worker 1422*cda5da8dSAndroid Build Coastguard Worker 1423*cda5da8dSAndroid Build Coastguard Worker def _filter_handle_list(self, handle_list): 1424*cda5da8dSAndroid Build Coastguard Worker """Filter out console handles that can't be used 1425*cda5da8dSAndroid Build Coastguard Worker in lpAttributeList["handle_list"] and make sure the list 1426*cda5da8dSAndroid Build Coastguard Worker isn't empty. This also removes duplicate handles.""" 1427*cda5da8dSAndroid Build Coastguard Worker # An handle with it's lowest two bits set might be a special console 1428*cda5da8dSAndroid Build Coastguard Worker # handle that if passed in lpAttributeList["handle_list"], will 1429*cda5da8dSAndroid Build Coastguard Worker # cause it to fail. 1430*cda5da8dSAndroid Build Coastguard Worker return list({handle for handle in handle_list 1431*cda5da8dSAndroid Build Coastguard Worker if handle & 0x3 != 0x3 1432*cda5da8dSAndroid Build Coastguard Worker or _winapi.GetFileType(handle) != 1433*cda5da8dSAndroid Build Coastguard Worker _winapi.FILE_TYPE_CHAR}) 1434*cda5da8dSAndroid Build Coastguard Worker 1435*cda5da8dSAndroid Build Coastguard Worker 1436*cda5da8dSAndroid Build Coastguard Worker def _execute_child(self, args, executable, preexec_fn, close_fds, 1437*cda5da8dSAndroid Build Coastguard Worker pass_fds, cwd, env, 1438*cda5da8dSAndroid Build Coastguard Worker startupinfo, creationflags, shell, 1439*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite, 1440*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 1441*cda5da8dSAndroid Build Coastguard Worker errread, errwrite, 1442*cda5da8dSAndroid Build Coastguard Worker unused_restore_signals, 1443*cda5da8dSAndroid Build Coastguard Worker unused_gid, unused_gids, unused_uid, 1444*cda5da8dSAndroid Build Coastguard Worker unused_umask, 1445*cda5da8dSAndroid Build Coastguard Worker unused_start_new_session, unused_process_group): 1446*cda5da8dSAndroid Build Coastguard Worker """Execute program (MS Windows version)""" 1447*cda5da8dSAndroid Build Coastguard Worker 1448*cda5da8dSAndroid Build Coastguard Worker assert not pass_fds, "pass_fds not supported on Windows." 1449*cda5da8dSAndroid Build Coastguard Worker 1450*cda5da8dSAndroid Build Coastguard Worker if isinstance(args, str): 1451*cda5da8dSAndroid Build Coastguard Worker pass 1452*cda5da8dSAndroid Build Coastguard Worker elif isinstance(args, bytes): 1453*cda5da8dSAndroid Build Coastguard Worker if shell: 1454*cda5da8dSAndroid Build Coastguard Worker raise TypeError('bytes args is not allowed on Windows') 1455*cda5da8dSAndroid Build Coastguard Worker args = list2cmdline([args]) 1456*cda5da8dSAndroid Build Coastguard Worker elif isinstance(args, os.PathLike): 1457*cda5da8dSAndroid Build Coastguard Worker if shell: 1458*cda5da8dSAndroid Build Coastguard Worker raise TypeError('path-like args is not allowed when ' 1459*cda5da8dSAndroid Build Coastguard Worker 'shell is true') 1460*cda5da8dSAndroid Build Coastguard Worker args = list2cmdline([args]) 1461*cda5da8dSAndroid Build Coastguard Worker else: 1462*cda5da8dSAndroid Build Coastguard Worker args = list2cmdline(args) 1463*cda5da8dSAndroid Build Coastguard Worker 1464*cda5da8dSAndroid Build Coastguard Worker if executable is not None: 1465*cda5da8dSAndroid Build Coastguard Worker executable = os.fsdecode(executable) 1466*cda5da8dSAndroid Build Coastguard Worker 1467*cda5da8dSAndroid Build Coastguard Worker # Process startup details 1468*cda5da8dSAndroid Build Coastguard Worker if startupinfo is None: 1469*cda5da8dSAndroid Build Coastguard Worker startupinfo = STARTUPINFO() 1470*cda5da8dSAndroid Build Coastguard Worker else: 1471*cda5da8dSAndroid Build Coastguard Worker # bpo-34044: Copy STARTUPINFO since it is modified above, 1472*cda5da8dSAndroid Build Coastguard Worker # so the caller can reuse it multiple times. 1473*cda5da8dSAndroid Build Coastguard Worker startupinfo = startupinfo.copy() 1474*cda5da8dSAndroid Build Coastguard Worker 1475*cda5da8dSAndroid Build Coastguard Worker use_std_handles = -1 not in (p2cread, c2pwrite, errwrite) 1476*cda5da8dSAndroid Build Coastguard Worker if use_std_handles: 1477*cda5da8dSAndroid Build Coastguard Worker startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES 1478*cda5da8dSAndroid Build Coastguard Worker startupinfo.hStdInput = p2cread 1479*cda5da8dSAndroid Build Coastguard Worker startupinfo.hStdOutput = c2pwrite 1480*cda5da8dSAndroid Build Coastguard Worker startupinfo.hStdError = errwrite 1481*cda5da8dSAndroid Build Coastguard Worker 1482*cda5da8dSAndroid Build Coastguard Worker attribute_list = startupinfo.lpAttributeList 1483*cda5da8dSAndroid Build Coastguard Worker have_handle_list = bool(attribute_list and 1484*cda5da8dSAndroid Build Coastguard Worker "handle_list" in attribute_list and 1485*cda5da8dSAndroid Build Coastguard Worker attribute_list["handle_list"]) 1486*cda5da8dSAndroid Build Coastguard Worker 1487*cda5da8dSAndroid Build Coastguard Worker # If we were given an handle_list or need to create one 1488*cda5da8dSAndroid Build Coastguard Worker if have_handle_list or (use_std_handles and close_fds): 1489*cda5da8dSAndroid Build Coastguard Worker if attribute_list is None: 1490*cda5da8dSAndroid Build Coastguard Worker attribute_list = startupinfo.lpAttributeList = {} 1491*cda5da8dSAndroid Build Coastguard Worker handle_list = attribute_list["handle_list"] = \ 1492*cda5da8dSAndroid Build Coastguard Worker list(attribute_list.get("handle_list", [])) 1493*cda5da8dSAndroid Build Coastguard Worker 1494*cda5da8dSAndroid Build Coastguard Worker if use_std_handles: 1495*cda5da8dSAndroid Build Coastguard Worker handle_list += [int(p2cread), int(c2pwrite), int(errwrite)] 1496*cda5da8dSAndroid Build Coastguard Worker 1497*cda5da8dSAndroid Build Coastguard Worker handle_list[:] = self._filter_handle_list(handle_list) 1498*cda5da8dSAndroid Build Coastguard Worker 1499*cda5da8dSAndroid Build Coastguard Worker if handle_list: 1500*cda5da8dSAndroid Build Coastguard Worker if not close_fds: 1501*cda5da8dSAndroid Build Coastguard Worker warnings.warn("startupinfo.lpAttributeList['handle_list'] " 1502*cda5da8dSAndroid Build Coastguard Worker "overriding close_fds", RuntimeWarning) 1503*cda5da8dSAndroid Build Coastguard Worker 1504*cda5da8dSAndroid Build Coastguard Worker # When using the handle_list we always request to inherit 1505*cda5da8dSAndroid Build Coastguard Worker # handles but the only handles that will be inherited are 1506*cda5da8dSAndroid Build Coastguard Worker # the ones in the handle_list 1507*cda5da8dSAndroid Build Coastguard Worker close_fds = False 1508*cda5da8dSAndroid Build Coastguard Worker 1509*cda5da8dSAndroid Build Coastguard Worker if shell: 1510*cda5da8dSAndroid Build Coastguard Worker startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW 1511*cda5da8dSAndroid Build Coastguard Worker startupinfo.wShowWindow = _winapi.SW_HIDE 1512*cda5da8dSAndroid Build Coastguard Worker if not executable: 1513*cda5da8dSAndroid Build Coastguard Worker # gh-101283: without a fully-qualified path, before Windows 1514*cda5da8dSAndroid Build Coastguard Worker # checks the system directories, it first looks in the 1515*cda5da8dSAndroid Build Coastguard Worker # application directory, and also the current directory if 1516*cda5da8dSAndroid Build Coastguard Worker # NeedCurrentDirectoryForExePathW(ExeName) is true, so try 1517*cda5da8dSAndroid Build Coastguard Worker # to avoid executing unqualified "cmd.exe". 1518*cda5da8dSAndroid Build Coastguard Worker comspec = os.environ.get('ComSpec') 1519*cda5da8dSAndroid Build Coastguard Worker if not comspec: 1520*cda5da8dSAndroid Build Coastguard Worker system_root = os.environ.get('SystemRoot', '') 1521*cda5da8dSAndroid Build Coastguard Worker comspec = os.path.join(system_root, 'System32', 'cmd.exe') 1522*cda5da8dSAndroid Build Coastguard Worker if not os.path.isabs(comspec): 1523*cda5da8dSAndroid Build Coastguard Worker raise FileNotFoundError('shell not found: neither %ComSpec% nor %SystemRoot% is set') 1524*cda5da8dSAndroid Build Coastguard Worker if os.path.isabs(comspec): 1525*cda5da8dSAndroid Build Coastguard Worker executable = comspec 1526*cda5da8dSAndroid Build Coastguard Worker else: 1527*cda5da8dSAndroid Build Coastguard Worker comspec = executable 1528*cda5da8dSAndroid Build Coastguard Worker 1529*cda5da8dSAndroid Build Coastguard Worker args = '{} /c "{}"'.format (comspec, args) 1530*cda5da8dSAndroid Build Coastguard Worker 1531*cda5da8dSAndroid Build Coastguard Worker if cwd is not None: 1532*cda5da8dSAndroid Build Coastguard Worker cwd = os.fsdecode(cwd) 1533*cda5da8dSAndroid Build Coastguard Worker 1534*cda5da8dSAndroid Build Coastguard Worker sys.audit("subprocess.Popen", executable, args, cwd, env) 1535*cda5da8dSAndroid Build Coastguard Worker 1536*cda5da8dSAndroid Build Coastguard Worker # Start the process 1537*cda5da8dSAndroid Build Coastguard Worker try: 1538*cda5da8dSAndroid Build Coastguard Worker hp, ht, pid, tid = _winapi.CreateProcess(executable, args, 1539*cda5da8dSAndroid Build Coastguard Worker # no special security 1540*cda5da8dSAndroid Build Coastguard Worker None, None, 1541*cda5da8dSAndroid Build Coastguard Worker int(not close_fds), 1542*cda5da8dSAndroid Build Coastguard Worker creationflags, 1543*cda5da8dSAndroid Build Coastguard Worker env, 1544*cda5da8dSAndroid Build Coastguard Worker cwd, 1545*cda5da8dSAndroid Build Coastguard Worker startupinfo) 1546*cda5da8dSAndroid Build Coastguard Worker finally: 1547*cda5da8dSAndroid Build Coastguard Worker # Child is launched. Close the parent's copy of those pipe 1548*cda5da8dSAndroid Build Coastguard Worker # handles that only the child should have open. You need 1549*cda5da8dSAndroid Build Coastguard Worker # to make sure that no handles to the write end of the 1550*cda5da8dSAndroid Build Coastguard Worker # output pipe are maintained in this process or else the 1551*cda5da8dSAndroid Build Coastguard Worker # pipe will not close when the child process exits and the 1552*cda5da8dSAndroid Build Coastguard Worker # ReadFile will hang. 1553*cda5da8dSAndroid Build Coastguard Worker self._close_pipe_fds(p2cread, p2cwrite, 1554*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 1555*cda5da8dSAndroid Build Coastguard Worker errread, errwrite) 1556*cda5da8dSAndroid Build Coastguard Worker 1557*cda5da8dSAndroid Build Coastguard Worker # Retain the process handle, but close the thread handle 1558*cda5da8dSAndroid Build Coastguard Worker self._child_created = True 1559*cda5da8dSAndroid Build Coastguard Worker self._handle = Handle(hp) 1560*cda5da8dSAndroid Build Coastguard Worker self.pid = pid 1561*cda5da8dSAndroid Build Coastguard Worker _winapi.CloseHandle(ht) 1562*cda5da8dSAndroid Build Coastguard Worker 1563*cda5da8dSAndroid Build Coastguard Worker def _internal_poll(self, _deadstate=None, 1564*cda5da8dSAndroid Build Coastguard Worker _WaitForSingleObject=_winapi.WaitForSingleObject, 1565*cda5da8dSAndroid Build Coastguard Worker _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0, 1566*cda5da8dSAndroid Build Coastguard Worker _GetExitCodeProcess=_winapi.GetExitCodeProcess): 1567*cda5da8dSAndroid Build Coastguard Worker """Check if child process has terminated. Returns returncode 1568*cda5da8dSAndroid Build Coastguard Worker attribute. 1569*cda5da8dSAndroid Build Coastguard Worker 1570*cda5da8dSAndroid Build Coastguard Worker This method is called by __del__, so it can only refer to objects 1571*cda5da8dSAndroid Build Coastguard Worker in its local scope. 1572*cda5da8dSAndroid Build Coastguard Worker 1573*cda5da8dSAndroid Build Coastguard Worker """ 1574*cda5da8dSAndroid Build Coastguard Worker if self.returncode is None: 1575*cda5da8dSAndroid Build Coastguard Worker if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0: 1576*cda5da8dSAndroid Build Coastguard Worker self.returncode = _GetExitCodeProcess(self._handle) 1577*cda5da8dSAndroid Build Coastguard Worker return self.returncode 1578*cda5da8dSAndroid Build Coastguard Worker 1579*cda5da8dSAndroid Build Coastguard Worker 1580*cda5da8dSAndroid Build Coastguard Worker def _wait(self, timeout): 1581*cda5da8dSAndroid Build Coastguard Worker """Internal implementation of wait() on Windows.""" 1582*cda5da8dSAndroid Build Coastguard Worker if timeout is None: 1583*cda5da8dSAndroid Build Coastguard Worker timeout_millis = _winapi.INFINITE 1584*cda5da8dSAndroid Build Coastguard Worker else: 1585*cda5da8dSAndroid Build Coastguard Worker timeout_millis = int(timeout * 1000) 1586*cda5da8dSAndroid Build Coastguard Worker if self.returncode is None: 1587*cda5da8dSAndroid Build Coastguard Worker # API note: Returns immediately if timeout_millis == 0. 1588*cda5da8dSAndroid Build Coastguard Worker result = _winapi.WaitForSingleObject(self._handle, 1589*cda5da8dSAndroid Build Coastguard Worker timeout_millis) 1590*cda5da8dSAndroid Build Coastguard Worker if result == _winapi.WAIT_TIMEOUT: 1591*cda5da8dSAndroid Build Coastguard Worker raise TimeoutExpired(self.args, timeout) 1592*cda5da8dSAndroid Build Coastguard Worker self.returncode = _winapi.GetExitCodeProcess(self._handle) 1593*cda5da8dSAndroid Build Coastguard Worker return self.returncode 1594*cda5da8dSAndroid Build Coastguard Worker 1595*cda5da8dSAndroid Build Coastguard Worker 1596*cda5da8dSAndroid Build Coastguard Worker def _readerthread(self, fh, buffer): 1597*cda5da8dSAndroid Build Coastguard Worker buffer.append(fh.read()) 1598*cda5da8dSAndroid Build Coastguard Worker fh.close() 1599*cda5da8dSAndroid Build Coastguard Worker 1600*cda5da8dSAndroid Build Coastguard Worker 1601*cda5da8dSAndroid Build Coastguard Worker def _communicate(self, input, endtime, orig_timeout): 1602*cda5da8dSAndroid Build Coastguard Worker # Start reader threads feeding into a list hanging off of this 1603*cda5da8dSAndroid Build Coastguard Worker # object, unless they've already been started. 1604*cda5da8dSAndroid Build Coastguard Worker if self.stdout and not hasattr(self, "_stdout_buff"): 1605*cda5da8dSAndroid Build Coastguard Worker self._stdout_buff = [] 1606*cda5da8dSAndroid Build Coastguard Worker self.stdout_thread = \ 1607*cda5da8dSAndroid Build Coastguard Worker threading.Thread(target=self._readerthread, 1608*cda5da8dSAndroid Build Coastguard Worker args=(self.stdout, self._stdout_buff)) 1609*cda5da8dSAndroid Build Coastguard Worker self.stdout_thread.daemon = True 1610*cda5da8dSAndroid Build Coastguard Worker self.stdout_thread.start() 1611*cda5da8dSAndroid Build Coastguard Worker if self.stderr and not hasattr(self, "_stderr_buff"): 1612*cda5da8dSAndroid Build Coastguard Worker self._stderr_buff = [] 1613*cda5da8dSAndroid Build Coastguard Worker self.stderr_thread = \ 1614*cda5da8dSAndroid Build Coastguard Worker threading.Thread(target=self._readerthread, 1615*cda5da8dSAndroid Build Coastguard Worker args=(self.stderr, self._stderr_buff)) 1616*cda5da8dSAndroid Build Coastguard Worker self.stderr_thread.daemon = True 1617*cda5da8dSAndroid Build Coastguard Worker self.stderr_thread.start() 1618*cda5da8dSAndroid Build Coastguard Worker 1619*cda5da8dSAndroid Build Coastguard Worker if self.stdin: 1620*cda5da8dSAndroid Build Coastguard Worker self._stdin_write(input) 1621*cda5da8dSAndroid Build Coastguard Worker 1622*cda5da8dSAndroid Build Coastguard Worker # Wait for the reader threads, or time out. If we time out, the 1623*cda5da8dSAndroid Build Coastguard Worker # threads remain reading and the fds left open in case the user 1624*cda5da8dSAndroid Build Coastguard Worker # calls communicate again. 1625*cda5da8dSAndroid Build Coastguard Worker if self.stdout is not None: 1626*cda5da8dSAndroid Build Coastguard Worker self.stdout_thread.join(self._remaining_time(endtime)) 1627*cda5da8dSAndroid Build Coastguard Worker if self.stdout_thread.is_alive(): 1628*cda5da8dSAndroid Build Coastguard Worker raise TimeoutExpired(self.args, orig_timeout) 1629*cda5da8dSAndroid Build Coastguard Worker if self.stderr is not None: 1630*cda5da8dSAndroid Build Coastguard Worker self.stderr_thread.join(self._remaining_time(endtime)) 1631*cda5da8dSAndroid Build Coastguard Worker if self.stderr_thread.is_alive(): 1632*cda5da8dSAndroid Build Coastguard Worker raise TimeoutExpired(self.args, orig_timeout) 1633*cda5da8dSAndroid Build Coastguard Worker 1634*cda5da8dSAndroid Build Coastguard Worker # Collect the output from and close both pipes, now that we know 1635*cda5da8dSAndroid Build Coastguard Worker # both have been read successfully. 1636*cda5da8dSAndroid Build Coastguard Worker stdout = None 1637*cda5da8dSAndroid Build Coastguard Worker stderr = None 1638*cda5da8dSAndroid Build Coastguard Worker if self.stdout: 1639*cda5da8dSAndroid Build Coastguard Worker stdout = self._stdout_buff 1640*cda5da8dSAndroid Build Coastguard Worker self.stdout.close() 1641*cda5da8dSAndroid Build Coastguard Worker if self.stderr: 1642*cda5da8dSAndroid Build Coastguard Worker stderr = self._stderr_buff 1643*cda5da8dSAndroid Build Coastguard Worker self.stderr.close() 1644*cda5da8dSAndroid Build Coastguard Worker 1645*cda5da8dSAndroid Build Coastguard Worker # All data exchanged. Translate lists into strings. 1646*cda5da8dSAndroid Build Coastguard Worker stdout = stdout[0] if stdout else None 1647*cda5da8dSAndroid Build Coastguard Worker stderr = stderr[0] if stderr else None 1648*cda5da8dSAndroid Build Coastguard Worker 1649*cda5da8dSAndroid Build Coastguard Worker return (stdout, stderr) 1650*cda5da8dSAndroid Build Coastguard Worker 1651*cda5da8dSAndroid Build Coastguard Worker def send_signal(self, sig): 1652*cda5da8dSAndroid Build Coastguard Worker """Send a signal to the process.""" 1653*cda5da8dSAndroid Build Coastguard Worker # Don't signal a process that we know has already died. 1654*cda5da8dSAndroid Build Coastguard Worker if self.returncode is not None: 1655*cda5da8dSAndroid Build Coastguard Worker return 1656*cda5da8dSAndroid Build Coastguard Worker if sig == signal.SIGTERM: 1657*cda5da8dSAndroid Build Coastguard Worker self.terminate() 1658*cda5da8dSAndroid Build Coastguard Worker elif sig == signal.CTRL_C_EVENT: 1659*cda5da8dSAndroid Build Coastguard Worker os.kill(self.pid, signal.CTRL_C_EVENT) 1660*cda5da8dSAndroid Build Coastguard Worker elif sig == signal.CTRL_BREAK_EVENT: 1661*cda5da8dSAndroid Build Coastguard Worker os.kill(self.pid, signal.CTRL_BREAK_EVENT) 1662*cda5da8dSAndroid Build Coastguard Worker else: 1663*cda5da8dSAndroid Build Coastguard Worker raise ValueError("Unsupported signal: {}".format(sig)) 1664*cda5da8dSAndroid Build Coastguard Worker 1665*cda5da8dSAndroid Build Coastguard Worker def terminate(self): 1666*cda5da8dSAndroid Build Coastguard Worker """Terminates the process.""" 1667*cda5da8dSAndroid Build Coastguard Worker # Don't terminate a process that we know has already died. 1668*cda5da8dSAndroid Build Coastguard Worker if self.returncode is not None: 1669*cda5da8dSAndroid Build Coastguard Worker return 1670*cda5da8dSAndroid Build Coastguard Worker try: 1671*cda5da8dSAndroid Build Coastguard Worker _winapi.TerminateProcess(self._handle, 1) 1672*cda5da8dSAndroid Build Coastguard Worker except PermissionError: 1673*cda5da8dSAndroid Build Coastguard Worker # ERROR_ACCESS_DENIED (winerror 5) is received when the 1674*cda5da8dSAndroid Build Coastguard Worker # process already died. 1675*cda5da8dSAndroid Build Coastguard Worker rc = _winapi.GetExitCodeProcess(self._handle) 1676*cda5da8dSAndroid Build Coastguard Worker if rc == _winapi.STILL_ACTIVE: 1677*cda5da8dSAndroid Build Coastguard Worker raise 1678*cda5da8dSAndroid Build Coastguard Worker self.returncode = rc 1679*cda5da8dSAndroid Build Coastguard Worker 1680*cda5da8dSAndroid Build Coastguard Worker kill = terminate 1681*cda5da8dSAndroid Build Coastguard Worker 1682*cda5da8dSAndroid Build Coastguard Worker else: 1683*cda5da8dSAndroid Build Coastguard Worker # 1684*cda5da8dSAndroid Build Coastguard Worker # POSIX methods 1685*cda5da8dSAndroid Build Coastguard Worker # 1686*cda5da8dSAndroid Build Coastguard Worker def _get_handles(self, stdin, stdout, stderr): 1687*cda5da8dSAndroid Build Coastguard Worker """Construct and return tuple with IO objects: 1688*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite 1689*cda5da8dSAndroid Build Coastguard Worker """ 1690*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite = -1, -1 1691*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite = -1, -1 1692*cda5da8dSAndroid Build Coastguard Worker errread, errwrite = -1, -1 1693*cda5da8dSAndroid Build Coastguard Worker 1694*cda5da8dSAndroid Build Coastguard Worker with self._on_error_fd_closer() as err_close_fds: 1695*cda5da8dSAndroid Build Coastguard Worker if stdin is None: 1696*cda5da8dSAndroid Build Coastguard Worker pass 1697*cda5da8dSAndroid Build Coastguard Worker elif stdin == PIPE: 1698*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite = os.pipe() 1699*cda5da8dSAndroid Build Coastguard Worker err_close_fds.extend((p2cread, p2cwrite)) 1700*cda5da8dSAndroid Build Coastguard Worker if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"): 1701*cda5da8dSAndroid Build Coastguard Worker fcntl.fcntl(p2cwrite, fcntl.F_SETPIPE_SZ, self.pipesize) 1702*cda5da8dSAndroid Build Coastguard Worker elif stdin == DEVNULL: 1703*cda5da8dSAndroid Build Coastguard Worker p2cread = self._get_devnull() 1704*cda5da8dSAndroid Build Coastguard Worker elif isinstance(stdin, int): 1705*cda5da8dSAndroid Build Coastguard Worker p2cread = stdin 1706*cda5da8dSAndroid Build Coastguard Worker else: 1707*cda5da8dSAndroid Build Coastguard Worker # Assuming file-like object 1708*cda5da8dSAndroid Build Coastguard Worker p2cread = stdin.fileno() 1709*cda5da8dSAndroid Build Coastguard Worker 1710*cda5da8dSAndroid Build Coastguard Worker if stdout is None: 1711*cda5da8dSAndroid Build Coastguard Worker pass 1712*cda5da8dSAndroid Build Coastguard Worker elif stdout == PIPE: 1713*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite = os.pipe() 1714*cda5da8dSAndroid Build Coastguard Worker err_close_fds.extend((c2pread, c2pwrite)) 1715*cda5da8dSAndroid Build Coastguard Worker if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"): 1716*cda5da8dSAndroid Build Coastguard Worker fcntl.fcntl(c2pwrite, fcntl.F_SETPIPE_SZ, self.pipesize) 1717*cda5da8dSAndroid Build Coastguard Worker elif stdout == DEVNULL: 1718*cda5da8dSAndroid Build Coastguard Worker c2pwrite = self._get_devnull() 1719*cda5da8dSAndroid Build Coastguard Worker elif isinstance(stdout, int): 1720*cda5da8dSAndroid Build Coastguard Worker c2pwrite = stdout 1721*cda5da8dSAndroid Build Coastguard Worker else: 1722*cda5da8dSAndroid Build Coastguard Worker # Assuming file-like object 1723*cda5da8dSAndroid Build Coastguard Worker c2pwrite = stdout.fileno() 1724*cda5da8dSAndroid Build Coastguard Worker 1725*cda5da8dSAndroid Build Coastguard Worker if stderr is None: 1726*cda5da8dSAndroid Build Coastguard Worker pass 1727*cda5da8dSAndroid Build Coastguard Worker elif stderr == PIPE: 1728*cda5da8dSAndroid Build Coastguard Worker errread, errwrite = os.pipe() 1729*cda5da8dSAndroid Build Coastguard Worker err_close_fds.extend((errread, errwrite)) 1730*cda5da8dSAndroid Build Coastguard Worker if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"): 1731*cda5da8dSAndroid Build Coastguard Worker fcntl.fcntl(errwrite, fcntl.F_SETPIPE_SZ, self.pipesize) 1732*cda5da8dSAndroid Build Coastguard Worker elif stderr == STDOUT: 1733*cda5da8dSAndroid Build Coastguard Worker if c2pwrite != -1: 1734*cda5da8dSAndroid Build Coastguard Worker errwrite = c2pwrite 1735*cda5da8dSAndroid Build Coastguard Worker else: # child's stdout is not set, use parent's stdout 1736*cda5da8dSAndroid Build Coastguard Worker errwrite = sys.__stdout__.fileno() 1737*cda5da8dSAndroid Build Coastguard Worker elif stderr == DEVNULL: 1738*cda5da8dSAndroid Build Coastguard Worker errwrite = self._get_devnull() 1739*cda5da8dSAndroid Build Coastguard Worker elif isinstance(stderr, int): 1740*cda5da8dSAndroid Build Coastguard Worker errwrite = stderr 1741*cda5da8dSAndroid Build Coastguard Worker else: 1742*cda5da8dSAndroid Build Coastguard Worker # Assuming file-like object 1743*cda5da8dSAndroid Build Coastguard Worker errwrite = stderr.fileno() 1744*cda5da8dSAndroid Build Coastguard Worker 1745*cda5da8dSAndroid Build Coastguard Worker return (p2cread, p2cwrite, 1746*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 1747*cda5da8dSAndroid Build Coastguard Worker errread, errwrite) 1748*cda5da8dSAndroid Build Coastguard Worker 1749*cda5da8dSAndroid Build Coastguard Worker 1750*cda5da8dSAndroid Build Coastguard Worker def _posix_spawn(self, args, executable, env, restore_signals, 1751*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite, 1752*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 1753*cda5da8dSAndroid Build Coastguard Worker errread, errwrite): 1754*cda5da8dSAndroid Build Coastguard Worker """Execute program using os.posix_spawn().""" 1755*cda5da8dSAndroid Build Coastguard Worker if env is None: 1756*cda5da8dSAndroid Build Coastguard Worker env = os.environ 1757*cda5da8dSAndroid Build Coastguard Worker 1758*cda5da8dSAndroid Build Coastguard Worker kwargs = {} 1759*cda5da8dSAndroid Build Coastguard Worker if restore_signals: 1760*cda5da8dSAndroid Build Coastguard Worker # See _Py_RestoreSignals() in Python/pylifecycle.c 1761*cda5da8dSAndroid Build Coastguard Worker sigset = [] 1762*cda5da8dSAndroid Build Coastguard Worker for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'): 1763*cda5da8dSAndroid Build Coastguard Worker signum = getattr(signal, signame, None) 1764*cda5da8dSAndroid Build Coastguard Worker if signum is not None: 1765*cda5da8dSAndroid Build Coastguard Worker sigset.append(signum) 1766*cda5da8dSAndroid Build Coastguard Worker kwargs['setsigdef'] = sigset 1767*cda5da8dSAndroid Build Coastguard Worker 1768*cda5da8dSAndroid Build Coastguard Worker file_actions = [] 1769*cda5da8dSAndroid Build Coastguard Worker for fd in (p2cwrite, c2pread, errread): 1770*cda5da8dSAndroid Build Coastguard Worker if fd != -1: 1771*cda5da8dSAndroid Build Coastguard Worker file_actions.append((os.POSIX_SPAWN_CLOSE, fd)) 1772*cda5da8dSAndroid Build Coastguard Worker for fd, fd2 in ( 1773*cda5da8dSAndroid Build Coastguard Worker (p2cread, 0), 1774*cda5da8dSAndroid Build Coastguard Worker (c2pwrite, 1), 1775*cda5da8dSAndroid Build Coastguard Worker (errwrite, 2), 1776*cda5da8dSAndroid Build Coastguard Worker ): 1777*cda5da8dSAndroid Build Coastguard Worker if fd != -1: 1778*cda5da8dSAndroid Build Coastguard Worker file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2)) 1779*cda5da8dSAndroid Build Coastguard Worker if file_actions: 1780*cda5da8dSAndroid Build Coastguard Worker kwargs['file_actions'] = file_actions 1781*cda5da8dSAndroid Build Coastguard Worker 1782*cda5da8dSAndroid Build Coastguard Worker self.pid = os.posix_spawn(executable, args, env, **kwargs) 1783*cda5da8dSAndroid Build Coastguard Worker self._child_created = True 1784*cda5da8dSAndroid Build Coastguard Worker 1785*cda5da8dSAndroid Build Coastguard Worker self._close_pipe_fds(p2cread, p2cwrite, 1786*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 1787*cda5da8dSAndroid Build Coastguard Worker errread, errwrite) 1788*cda5da8dSAndroid Build Coastguard Worker 1789*cda5da8dSAndroid Build Coastguard Worker def _execute_child(self, args, executable, preexec_fn, close_fds, 1790*cda5da8dSAndroid Build Coastguard Worker pass_fds, cwd, env, 1791*cda5da8dSAndroid Build Coastguard Worker startupinfo, creationflags, shell, 1792*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite, 1793*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 1794*cda5da8dSAndroid Build Coastguard Worker errread, errwrite, 1795*cda5da8dSAndroid Build Coastguard Worker restore_signals, 1796*cda5da8dSAndroid Build Coastguard Worker gid, gids, uid, umask, 1797*cda5da8dSAndroid Build Coastguard Worker start_new_session, process_group): 1798*cda5da8dSAndroid Build Coastguard Worker """Execute program (POSIX version)""" 1799*cda5da8dSAndroid Build Coastguard Worker 1800*cda5da8dSAndroid Build Coastguard Worker if isinstance(args, (str, bytes)): 1801*cda5da8dSAndroid Build Coastguard Worker args = [args] 1802*cda5da8dSAndroid Build Coastguard Worker elif isinstance(args, os.PathLike): 1803*cda5da8dSAndroid Build Coastguard Worker if shell: 1804*cda5da8dSAndroid Build Coastguard Worker raise TypeError('path-like args is not allowed when ' 1805*cda5da8dSAndroid Build Coastguard Worker 'shell is true') 1806*cda5da8dSAndroid Build Coastguard Worker args = [args] 1807*cda5da8dSAndroid Build Coastguard Worker else: 1808*cda5da8dSAndroid Build Coastguard Worker args = list(args) 1809*cda5da8dSAndroid Build Coastguard Worker 1810*cda5da8dSAndroid Build Coastguard Worker if shell: 1811*cda5da8dSAndroid Build Coastguard Worker # On Android the default shell is at '/system/bin/sh'. 1812*cda5da8dSAndroid Build Coastguard Worker unix_shell = ('/system/bin/sh' if 1813*cda5da8dSAndroid Build Coastguard Worker hasattr(sys, 'getandroidapilevel') else '/bin/sh') 1814*cda5da8dSAndroid Build Coastguard Worker args = [unix_shell, "-c"] + args 1815*cda5da8dSAndroid Build Coastguard Worker if executable: 1816*cda5da8dSAndroid Build Coastguard Worker args[0] = executable 1817*cda5da8dSAndroid Build Coastguard Worker 1818*cda5da8dSAndroid Build Coastguard Worker if executable is None: 1819*cda5da8dSAndroid Build Coastguard Worker executable = args[0] 1820*cda5da8dSAndroid Build Coastguard Worker 1821*cda5da8dSAndroid Build Coastguard Worker sys.audit("subprocess.Popen", executable, args, cwd, env) 1822*cda5da8dSAndroid Build Coastguard Worker 1823*cda5da8dSAndroid Build Coastguard Worker if (_USE_POSIX_SPAWN 1824*cda5da8dSAndroid Build Coastguard Worker and os.path.dirname(executable) 1825*cda5da8dSAndroid Build Coastguard Worker and preexec_fn is None 1826*cda5da8dSAndroid Build Coastguard Worker and not close_fds 1827*cda5da8dSAndroid Build Coastguard Worker and not pass_fds 1828*cda5da8dSAndroid Build Coastguard Worker and cwd is None 1829*cda5da8dSAndroid Build Coastguard Worker and (p2cread == -1 or p2cread > 2) 1830*cda5da8dSAndroid Build Coastguard Worker and (c2pwrite == -1 or c2pwrite > 2) 1831*cda5da8dSAndroid Build Coastguard Worker and (errwrite == -1 or errwrite > 2) 1832*cda5da8dSAndroid Build Coastguard Worker and not start_new_session 1833*cda5da8dSAndroid Build Coastguard Worker and process_group == -1 1834*cda5da8dSAndroid Build Coastguard Worker and gid is None 1835*cda5da8dSAndroid Build Coastguard Worker and gids is None 1836*cda5da8dSAndroid Build Coastguard Worker and uid is None 1837*cda5da8dSAndroid Build Coastguard Worker and umask < 0): 1838*cda5da8dSAndroid Build Coastguard Worker self._posix_spawn(args, executable, env, restore_signals, 1839*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite, 1840*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 1841*cda5da8dSAndroid Build Coastguard Worker errread, errwrite) 1842*cda5da8dSAndroid Build Coastguard Worker return 1843*cda5da8dSAndroid Build Coastguard Worker 1844*cda5da8dSAndroid Build Coastguard Worker orig_executable = executable 1845*cda5da8dSAndroid Build Coastguard Worker 1846*cda5da8dSAndroid Build Coastguard Worker # For transferring possible exec failure from child to parent. 1847*cda5da8dSAndroid Build Coastguard Worker # Data format: "exception name:hex errno:description" 1848*cda5da8dSAndroid Build Coastguard Worker # Pickle is not used; it is complex and involves memory allocation. 1849*cda5da8dSAndroid Build Coastguard Worker errpipe_read, errpipe_write = os.pipe() 1850*cda5da8dSAndroid Build Coastguard Worker # errpipe_write must not be in the standard io 0, 1, or 2 fd range. 1851*cda5da8dSAndroid Build Coastguard Worker low_fds_to_close = [] 1852*cda5da8dSAndroid Build Coastguard Worker while errpipe_write < 3: 1853*cda5da8dSAndroid Build Coastguard Worker low_fds_to_close.append(errpipe_write) 1854*cda5da8dSAndroid Build Coastguard Worker errpipe_write = os.dup(errpipe_write) 1855*cda5da8dSAndroid Build Coastguard Worker for low_fd in low_fds_to_close: 1856*cda5da8dSAndroid Build Coastguard Worker os.close(low_fd) 1857*cda5da8dSAndroid Build Coastguard Worker try: 1858*cda5da8dSAndroid Build Coastguard Worker try: 1859*cda5da8dSAndroid Build Coastguard Worker # We must avoid complex work that could involve 1860*cda5da8dSAndroid Build Coastguard Worker # malloc or free in the child process to avoid 1861*cda5da8dSAndroid Build Coastguard Worker # potential deadlocks, thus we do all this here. 1862*cda5da8dSAndroid Build Coastguard Worker # and pass it to fork_exec() 1863*cda5da8dSAndroid Build Coastguard Worker 1864*cda5da8dSAndroid Build Coastguard Worker if env is not None: 1865*cda5da8dSAndroid Build Coastguard Worker env_list = [] 1866*cda5da8dSAndroid Build Coastguard Worker for k, v in env.items(): 1867*cda5da8dSAndroid Build Coastguard Worker k = os.fsencode(k) 1868*cda5da8dSAndroid Build Coastguard Worker if b'=' in k: 1869*cda5da8dSAndroid Build Coastguard Worker raise ValueError("illegal environment variable name") 1870*cda5da8dSAndroid Build Coastguard Worker env_list.append(k + b'=' + os.fsencode(v)) 1871*cda5da8dSAndroid Build Coastguard Worker else: 1872*cda5da8dSAndroid Build Coastguard Worker env_list = None # Use execv instead of execve. 1873*cda5da8dSAndroid Build Coastguard Worker executable = os.fsencode(executable) 1874*cda5da8dSAndroid Build Coastguard Worker if os.path.dirname(executable): 1875*cda5da8dSAndroid Build Coastguard Worker executable_list = (executable,) 1876*cda5da8dSAndroid Build Coastguard Worker else: 1877*cda5da8dSAndroid Build Coastguard Worker # This matches the behavior of os._execvpe(). 1878*cda5da8dSAndroid Build Coastguard Worker executable_list = tuple( 1879*cda5da8dSAndroid Build Coastguard Worker os.path.join(os.fsencode(dir), executable) 1880*cda5da8dSAndroid Build Coastguard Worker for dir in os.get_exec_path(env)) 1881*cda5da8dSAndroid Build Coastguard Worker fds_to_keep = set(pass_fds) 1882*cda5da8dSAndroid Build Coastguard Worker fds_to_keep.add(errpipe_write) 1883*cda5da8dSAndroid Build Coastguard Worker self.pid = _fork_exec( 1884*cda5da8dSAndroid Build Coastguard Worker args, executable_list, 1885*cda5da8dSAndroid Build Coastguard Worker close_fds, tuple(sorted(map(int, fds_to_keep))), 1886*cda5da8dSAndroid Build Coastguard Worker cwd, env_list, 1887*cda5da8dSAndroid Build Coastguard Worker p2cread, p2cwrite, c2pread, c2pwrite, 1888*cda5da8dSAndroid Build Coastguard Worker errread, errwrite, 1889*cda5da8dSAndroid Build Coastguard Worker errpipe_read, errpipe_write, 1890*cda5da8dSAndroid Build Coastguard Worker restore_signals, start_new_session, 1891*cda5da8dSAndroid Build Coastguard Worker process_group, gid, gids, uid, umask, 1892*cda5da8dSAndroid Build Coastguard Worker preexec_fn, _USE_VFORK) 1893*cda5da8dSAndroid Build Coastguard Worker self._child_created = True 1894*cda5da8dSAndroid Build Coastguard Worker finally: 1895*cda5da8dSAndroid Build Coastguard Worker # be sure the FD is closed no matter what 1896*cda5da8dSAndroid Build Coastguard Worker os.close(errpipe_write) 1897*cda5da8dSAndroid Build Coastguard Worker 1898*cda5da8dSAndroid Build Coastguard Worker self._close_pipe_fds(p2cread, p2cwrite, 1899*cda5da8dSAndroid Build Coastguard Worker c2pread, c2pwrite, 1900*cda5da8dSAndroid Build Coastguard Worker errread, errwrite) 1901*cda5da8dSAndroid Build Coastguard Worker 1902*cda5da8dSAndroid Build Coastguard Worker # Wait for exec to fail or succeed; possibly raising an 1903*cda5da8dSAndroid Build Coastguard Worker # exception (limited in size) 1904*cda5da8dSAndroid Build Coastguard Worker errpipe_data = bytearray() 1905*cda5da8dSAndroid Build Coastguard Worker while True: 1906*cda5da8dSAndroid Build Coastguard Worker part = os.read(errpipe_read, 50000) 1907*cda5da8dSAndroid Build Coastguard Worker errpipe_data += part 1908*cda5da8dSAndroid Build Coastguard Worker if not part or len(errpipe_data) > 50000: 1909*cda5da8dSAndroid Build Coastguard Worker break 1910*cda5da8dSAndroid Build Coastguard Worker finally: 1911*cda5da8dSAndroid Build Coastguard Worker # be sure the FD is closed no matter what 1912*cda5da8dSAndroid Build Coastguard Worker os.close(errpipe_read) 1913*cda5da8dSAndroid Build Coastguard Worker 1914*cda5da8dSAndroid Build Coastguard Worker if errpipe_data: 1915*cda5da8dSAndroid Build Coastguard Worker try: 1916*cda5da8dSAndroid Build Coastguard Worker pid, sts = os.waitpid(self.pid, 0) 1917*cda5da8dSAndroid Build Coastguard Worker if pid == self.pid: 1918*cda5da8dSAndroid Build Coastguard Worker self._handle_exitstatus(sts) 1919*cda5da8dSAndroid Build Coastguard Worker else: 1920*cda5da8dSAndroid Build Coastguard Worker self.returncode = sys.maxsize 1921*cda5da8dSAndroid Build Coastguard Worker except ChildProcessError: 1922*cda5da8dSAndroid Build Coastguard Worker pass 1923*cda5da8dSAndroid Build Coastguard Worker 1924*cda5da8dSAndroid Build Coastguard Worker try: 1925*cda5da8dSAndroid Build Coastguard Worker exception_name, hex_errno, err_msg = ( 1926*cda5da8dSAndroid Build Coastguard Worker errpipe_data.split(b':', 2)) 1927*cda5da8dSAndroid Build Coastguard Worker # The encoding here should match the encoding 1928*cda5da8dSAndroid Build Coastguard Worker # written in by the subprocess implementations 1929*cda5da8dSAndroid Build Coastguard Worker # like _posixsubprocess 1930*cda5da8dSAndroid Build Coastguard Worker err_msg = err_msg.decode() 1931*cda5da8dSAndroid Build Coastguard Worker except ValueError: 1932*cda5da8dSAndroid Build Coastguard Worker exception_name = b'SubprocessError' 1933*cda5da8dSAndroid Build Coastguard Worker hex_errno = b'0' 1934*cda5da8dSAndroid Build Coastguard Worker err_msg = 'Bad exception data from child: {!r}'.format( 1935*cda5da8dSAndroid Build Coastguard Worker bytes(errpipe_data)) 1936*cda5da8dSAndroid Build Coastguard Worker child_exception_type = getattr( 1937*cda5da8dSAndroid Build Coastguard Worker builtins, exception_name.decode('ascii'), 1938*cda5da8dSAndroid Build Coastguard Worker SubprocessError) 1939*cda5da8dSAndroid Build Coastguard Worker if issubclass(child_exception_type, OSError) and hex_errno: 1940*cda5da8dSAndroid Build Coastguard Worker errno_num = int(hex_errno, 16) 1941*cda5da8dSAndroid Build Coastguard Worker child_exec_never_called = (err_msg == "noexec") 1942*cda5da8dSAndroid Build Coastguard Worker if child_exec_never_called: 1943*cda5da8dSAndroid Build Coastguard Worker err_msg = "" 1944*cda5da8dSAndroid Build Coastguard Worker # The error must be from chdir(cwd). 1945*cda5da8dSAndroid Build Coastguard Worker err_filename = cwd 1946*cda5da8dSAndroid Build Coastguard Worker else: 1947*cda5da8dSAndroid Build Coastguard Worker err_filename = orig_executable 1948*cda5da8dSAndroid Build Coastguard Worker if errno_num != 0: 1949*cda5da8dSAndroid Build Coastguard Worker err_msg = os.strerror(errno_num) 1950*cda5da8dSAndroid Build Coastguard Worker raise child_exception_type(errno_num, err_msg, err_filename) 1951*cda5da8dSAndroid Build Coastguard Worker raise child_exception_type(err_msg) 1952*cda5da8dSAndroid Build Coastguard Worker 1953*cda5da8dSAndroid Build Coastguard Worker 1954*cda5da8dSAndroid Build Coastguard Worker def _handle_exitstatus(self, sts, 1955*cda5da8dSAndroid Build Coastguard Worker _waitstatus_to_exitcode=_waitstatus_to_exitcode, 1956*cda5da8dSAndroid Build Coastguard Worker _WIFSTOPPED=_WIFSTOPPED, 1957*cda5da8dSAndroid Build Coastguard Worker _WSTOPSIG=_WSTOPSIG): 1958*cda5da8dSAndroid Build Coastguard Worker """All callers to this function MUST hold self._waitpid_lock.""" 1959*cda5da8dSAndroid Build Coastguard Worker # This method is called (indirectly) by __del__, so it cannot 1960*cda5da8dSAndroid Build Coastguard Worker # refer to anything outside of its local scope. 1961*cda5da8dSAndroid Build Coastguard Worker if _WIFSTOPPED(sts): 1962*cda5da8dSAndroid Build Coastguard Worker self.returncode = -_WSTOPSIG(sts) 1963*cda5da8dSAndroid Build Coastguard Worker else: 1964*cda5da8dSAndroid Build Coastguard Worker self.returncode = _waitstatus_to_exitcode(sts) 1965*cda5da8dSAndroid Build Coastguard Worker 1966*cda5da8dSAndroid Build Coastguard Worker def _internal_poll(self, _deadstate=None, _waitpid=_waitpid, 1967*cda5da8dSAndroid Build Coastguard Worker _WNOHANG=_WNOHANG, _ECHILD=errno.ECHILD): 1968*cda5da8dSAndroid Build Coastguard Worker """Check if child process has terminated. Returns returncode 1969*cda5da8dSAndroid Build Coastguard Worker attribute. 1970*cda5da8dSAndroid Build Coastguard Worker 1971*cda5da8dSAndroid Build Coastguard Worker This method is called by __del__, so it cannot reference anything 1972*cda5da8dSAndroid Build Coastguard Worker outside of the local scope (nor can any methods it calls). 1973*cda5da8dSAndroid Build Coastguard Worker 1974*cda5da8dSAndroid Build Coastguard Worker """ 1975*cda5da8dSAndroid Build Coastguard Worker if self.returncode is None: 1976*cda5da8dSAndroid Build Coastguard Worker if not self._waitpid_lock.acquire(False): 1977*cda5da8dSAndroid Build Coastguard Worker # Something else is busy calling waitpid. Don't allow two 1978*cda5da8dSAndroid Build Coastguard Worker # at once. We know nothing yet. 1979*cda5da8dSAndroid Build Coastguard Worker return None 1980*cda5da8dSAndroid Build Coastguard Worker try: 1981*cda5da8dSAndroid Build Coastguard Worker if self.returncode is not None: 1982*cda5da8dSAndroid Build Coastguard Worker return self.returncode # Another thread waited. 1983*cda5da8dSAndroid Build Coastguard Worker pid, sts = _waitpid(self.pid, _WNOHANG) 1984*cda5da8dSAndroid Build Coastguard Worker if pid == self.pid: 1985*cda5da8dSAndroid Build Coastguard Worker self._handle_exitstatus(sts) 1986*cda5da8dSAndroid Build Coastguard Worker except OSError as e: 1987*cda5da8dSAndroid Build Coastguard Worker if _deadstate is not None: 1988*cda5da8dSAndroid Build Coastguard Worker self.returncode = _deadstate 1989*cda5da8dSAndroid Build Coastguard Worker elif e.errno == _ECHILD: 1990*cda5da8dSAndroid Build Coastguard Worker # This happens if SIGCLD is set to be ignored or 1991*cda5da8dSAndroid Build Coastguard Worker # waiting for child processes has otherwise been 1992*cda5da8dSAndroid Build Coastguard Worker # disabled for our process. This child is dead, we 1993*cda5da8dSAndroid Build Coastguard Worker # can't get the status. 1994*cda5da8dSAndroid Build Coastguard Worker # http://bugs.python.org/issue15756 1995*cda5da8dSAndroid Build Coastguard Worker self.returncode = 0 1996*cda5da8dSAndroid Build Coastguard Worker finally: 1997*cda5da8dSAndroid Build Coastguard Worker self._waitpid_lock.release() 1998*cda5da8dSAndroid Build Coastguard Worker return self.returncode 1999*cda5da8dSAndroid Build Coastguard Worker 2000*cda5da8dSAndroid Build Coastguard Worker 2001*cda5da8dSAndroid Build Coastguard Worker def _try_wait(self, wait_flags): 2002*cda5da8dSAndroid Build Coastguard Worker """All callers to this function MUST hold self._waitpid_lock.""" 2003*cda5da8dSAndroid Build Coastguard Worker try: 2004*cda5da8dSAndroid Build Coastguard Worker (pid, sts) = os.waitpid(self.pid, wait_flags) 2005*cda5da8dSAndroid Build Coastguard Worker except ChildProcessError: 2006*cda5da8dSAndroid Build Coastguard Worker # This happens if SIGCLD is set to be ignored or waiting 2007*cda5da8dSAndroid Build Coastguard Worker # for child processes has otherwise been disabled for our 2008*cda5da8dSAndroid Build Coastguard Worker # process. This child is dead, we can't get the status. 2009*cda5da8dSAndroid Build Coastguard Worker pid = self.pid 2010*cda5da8dSAndroid Build Coastguard Worker sts = 0 2011*cda5da8dSAndroid Build Coastguard Worker return (pid, sts) 2012*cda5da8dSAndroid Build Coastguard Worker 2013*cda5da8dSAndroid Build Coastguard Worker 2014*cda5da8dSAndroid Build Coastguard Worker def _wait(self, timeout): 2015*cda5da8dSAndroid Build Coastguard Worker """Internal implementation of wait() on POSIX.""" 2016*cda5da8dSAndroid Build Coastguard Worker if self.returncode is not None: 2017*cda5da8dSAndroid Build Coastguard Worker return self.returncode 2018*cda5da8dSAndroid Build Coastguard Worker 2019*cda5da8dSAndroid Build Coastguard Worker if timeout is not None: 2020*cda5da8dSAndroid Build Coastguard Worker endtime = _time() + timeout 2021*cda5da8dSAndroid Build Coastguard Worker # Enter a busy loop if we have a timeout. This busy loop was 2022*cda5da8dSAndroid Build Coastguard Worker # cribbed from Lib/threading.py in Thread.wait() at r71065. 2023*cda5da8dSAndroid Build Coastguard Worker delay = 0.0005 # 500 us -> initial delay of 1 ms 2024*cda5da8dSAndroid Build Coastguard Worker while True: 2025*cda5da8dSAndroid Build Coastguard Worker if self._waitpid_lock.acquire(False): 2026*cda5da8dSAndroid Build Coastguard Worker try: 2027*cda5da8dSAndroid Build Coastguard Worker if self.returncode is not None: 2028*cda5da8dSAndroid Build Coastguard Worker break # Another thread waited. 2029*cda5da8dSAndroid Build Coastguard Worker (pid, sts) = self._try_wait(os.WNOHANG) 2030*cda5da8dSAndroid Build Coastguard Worker assert pid == self.pid or pid == 0 2031*cda5da8dSAndroid Build Coastguard Worker if pid == self.pid: 2032*cda5da8dSAndroid Build Coastguard Worker self._handle_exitstatus(sts) 2033*cda5da8dSAndroid Build Coastguard Worker break 2034*cda5da8dSAndroid Build Coastguard Worker finally: 2035*cda5da8dSAndroid Build Coastguard Worker self._waitpid_lock.release() 2036*cda5da8dSAndroid Build Coastguard Worker remaining = self._remaining_time(endtime) 2037*cda5da8dSAndroid Build Coastguard Worker if remaining <= 0: 2038*cda5da8dSAndroid Build Coastguard Worker raise TimeoutExpired(self.args, timeout) 2039*cda5da8dSAndroid Build Coastguard Worker delay = min(delay * 2, remaining, .05) 2040*cda5da8dSAndroid Build Coastguard Worker time.sleep(delay) 2041*cda5da8dSAndroid Build Coastguard Worker else: 2042*cda5da8dSAndroid Build Coastguard Worker while self.returncode is None: 2043*cda5da8dSAndroid Build Coastguard Worker with self._waitpid_lock: 2044*cda5da8dSAndroid Build Coastguard Worker if self.returncode is not None: 2045*cda5da8dSAndroid Build Coastguard Worker break # Another thread waited. 2046*cda5da8dSAndroid Build Coastguard Worker (pid, sts) = self._try_wait(0) 2047*cda5da8dSAndroid Build Coastguard Worker # Check the pid and loop as waitpid has been known to 2048*cda5da8dSAndroid Build Coastguard Worker # return 0 even without WNOHANG in odd situations. 2049*cda5da8dSAndroid Build Coastguard Worker # http://bugs.python.org/issue14396. 2050*cda5da8dSAndroid Build Coastguard Worker if pid == self.pid: 2051*cda5da8dSAndroid Build Coastguard Worker self._handle_exitstatus(sts) 2052*cda5da8dSAndroid Build Coastguard Worker return self.returncode 2053*cda5da8dSAndroid Build Coastguard Worker 2054*cda5da8dSAndroid Build Coastguard Worker 2055*cda5da8dSAndroid Build Coastguard Worker def _communicate(self, input, endtime, orig_timeout): 2056*cda5da8dSAndroid Build Coastguard Worker if self.stdin and not self._communication_started: 2057*cda5da8dSAndroid Build Coastguard Worker # Flush stdio buffer. This might block, if the user has 2058*cda5da8dSAndroid Build Coastguard Worker # been writing to .stdin in an uncontrolled fashion. 2059*cda5da8dSAndroid Build Coastguard Worker try: 2060*cda5da8dSAndroid Build Coastguard Worker self.stdin.flush() 2061*cda5da8dSAndroid Build Coastguard Worker except BrokenPipeError: 2062*cda5da8dSAndroid Build Coastguard Worker pass # communicate() must ignore BrokenPipeError. 2063*cda5da8dSAndroid Build Coastguard Worker if not input: 2064*cda5da8dSAndroid Build Coastguard Worker try: 2065*cda5da8dSAndroid Build Coastguard Worker self.stdin.close() 2066*cda5da8dSAndroid Build Coastguard Worker except BrokenPipeError: 2067*cda5da8dSAndroid Build Coastguard Worker pass # communicate() must ignore BrokenPipeError. 2068*cda5da8dSAndroid Build Coastguard Worker 2069*cda5da8dSAndroid Build Coastguard Worker stdout = None 2070*cda5da8dSAndroid Build Coastguard Worker stderr = None 2071*cda5da8dSAndroid Build Coastguard Worker 2072*cda5da8dSAndroid Build Coastguard Worker # Only create this mapping if we haven't already. 2073*cda5da8dSAndroid Build Coastguard Worker if not self._communication_started: 2074*cda5da8dSAndroid Build Coastguard Worker self._fileobj2output = {} 2075*cda5da8dSAndroid Build Coastguard Worker if self.stdout: 2076*cda5da8dSAndroid Build Coastguard Worker self._fileobj2output[self.stdout] = [] 2077*cda5da8dSAndroid Build Coastguard Worker if self.stderr: 2078*cda5da8dSAndroid Build Coastguard Worker self._fileobj2output[self.stderr] = [] 2079*cda5da8dSAndroid Build Coastguard Worker 2080*cda5da8dSAndroid Build Coastguard Worker if self.stdout: 2081*cda5da8dSAndroid Build Coastguard Worker stdout = self._fileobj2output[self.stdout] 2082*cda5da8dSAndroid Build Coastguard Worker if self.stderr: 2083*cda5da8dSAndroid Build Coastguard Worker stderr = self._fileobj2output[self.stderr] 2084*cda5da8dSAndroid Build Coastguard Worker 2085*cda5da8dSAndroid Build Coastguard Worker self._save_input(input) 2086*cda5da8dSAndroid Build Coastguard Worker 2087*cda5da8dSAndroid Build Coastguard Worker if self._input: 2088*cda5da8dSAndroid Build Coastguard Worker input_view = memoryview(self._input) 2089*cda5da8dSAndroid Build Coastguard Worker 2090*cda5da8dSAndroid Build Coastguard Worker with _PopenSelector() as selector: 2091*cda5da8dSAndroid Build Coastguard Worker if self.stdin and input: 2092*cda5da8dSAndroid Build Coastguard Worker selector.register(self.stdin, selectors.EVENT_WRITE) 2093*cda5da8dSAndroid Build Coastguard Worker if self.stdout and not self.stdout.closed: 2094*cda5da8dSAndroid Build Coastguard Worker selector.register(self.stdout, selectors.EVENT_READ) 2095*cda5da8dSAndroid Build Coastguard Worker if self.stderr and not self.stderr.closed: 2096*cda5da8dSAndroid Build Coastguard Worker selector.register(self.stderr, selectors.EVENT_READ) 2097*cda5da8dSAndroid Build Coastguard Worker 2098*cda5da8dSAndroid Build Coastguard Worker while selector.get_map(): 2099*cda5da8dSAndroid Build Coastguard Worker timeout = self._remaining_time(endtime) 2100*cda5da8dSAndroid Build Coastguard Worker if timeout is not None and timeout < 0: 2101*cda5da8dSAndroid Build Coastguard Worker self._check_timeout(endtime, orig_timeout, 2102*cda5da8dSAndroid Build Coastguard Worker stdout, stderr, 2103*cda5da8dSAndroid Build Coastguard Worker skip_check_and_raise=True) 2104*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError( # Impossible :) 2105*cda5da8dSAndroid Build Coastguard Worker '_check_timeout(..., skip_check_and_raise=True) ' 2106*cda5da8dSAndroid Build Coastguard Worker 'failed to raise TimeoutExpired.') 2107*cda5da8dSAndroid Build Coastguard Worker 2108*cda5da8dSAndroid Build Coastguard Worker ready = selector.select(timeout) 2109*cda5da8dSAndroid Build Coastguard Worker self._check_timeout(endtime, orig_timeout, stdout, stderr) 2110*cda5da8dSAndroid Build Coastguard Worker 2111*cda5da8dSAndroid Build Coastguard Worker # XXX Rewrite these to use non-blocking I/O on the file 2112*cda5da8dSAndroid Build Coastguard Worker # objects; they are no longer using C stdio! 2113*cda5da8dSAndroid Build Coastguard Worker 2114*cda5da8dSAndroid Build Coastguard Worker for key, events in ready: 2115*cda5da8dSAndroid Build Coastguard Worker if key.fileobj is self.stdin: 2116*cda5da8dSAndroid Build Coastguard Worker chunk = input_view[self._input_offset : 2117*cda5da8dSAndroid Build Coastguard Worker self._input_offset + _PIPE_BUF] 2118*cda5da8dSAndroid Build Coastguard Worker try: 2119*cda5da8dSAndroid Build Coastguard Worker self._input_offset += os.write(key.fd, chunk) 2120*cda5da8dSAndroid Build Coastguard Worker except BrokenPipeError: 2121*cda5da8dSAndroid Build Coastguard Worker selector.unregister(key.fileobj) 2122*cda5da8dSAndroid Build Coastguard Worker key.fileobj.close() 2123*cda5da8dSAndroid Build Coastguard Worker else: 2124*cda5da8dSAndroid Build Coastguard Worker if self._input_offset >= len(self._input): 2125*cda5da8dSAndroid Build Coastguard Worker selector.unregister(key.fileobj) 2126*cda5da8dSAndroid Build Coastguard Worker key.fileobj.close() 2127*cda5da8dSAndroid Build Coastguard Worker elif key.fileobj in (self.stdout, self.stderr): 2128*cda5da8dSAndroid Build Coastguard Worker data = os.read(key.fd, 32768) 2129*cda5da8dSAndroid Build Coastguard Worker if not data: 2130*cda5da8dSAndroid Build Coastguard Worker selector.unregister(key.fileobj) 2131*cda5da8dSAndroid Build Coastguard Worker key.fileobj.close() 2132*cda5da8dSAndroid Build Coastguard Worker self._fileobj2output[key.fileobj].append(data) 2133*cda5da8dSAndroid Build Coastguard Worker 2134*cda5da8dSAndroid Build Coastguard Worker self.wait(timeout=self._remaining_time(endtime)) 2135*cda5da8dSAndroid Build Coastguard Worker 2136*cda5da8dSAndroid Build Coastguard Worker # All data exchanged. Translate lists into strings. 2137*cda5da8dSAndroid Build Coastguard Worker if stdout is not None: 2138*cda5da8dSAndroid Build Coastguard Worker stdout = b''.join(stdout) 2139*cda5da8dSAndroid Build Coastguard Worker if stderr is not None: 2140*cda5da8dSAndroid Build Coastguard Worker stderr = b''.join(stderr) 2141*cda5da8dSAndroid Build Coastguard Worker 2142*cda5da8dSAndroid Build Coastguard Worker # Translate newlines, if requested. 2143*cda5da8dSAndroid Build Coastguard Worker # This also turns bytes into strings. 2144*cda5da8dSAndroid Build Coastguard Worker if self.text_mode: 2145*cda5da8dSAndroid Build Coastguard Worker if stdout is not None: 2146*cda5da8dSAndroid Build Coastguard Worker stdout = self._translate_newlines(stdout, 2147*cda5da8dSAndroid Build Coastguard Worker self.stdout.encoding, 2148*cda5da8dSAndroid Build Coastguard Worker self.stdout.errors) 2149*cda5da8dSAndroid Build Coastguard Worker if stderr is not None: 2150*cda5da8dSAndroid Build Coastguard Worker stderr = self._translate_newlines(stderr, 2151*cda5da8dSAndroid Build Coastguard Worker self.stderr.encoding, 2152*cda5da8dSAndroid Build Coastguard Worker self.stderr.errors) 2153*cda5da8dSAndroid Build Coastguard Worker 2154*cda5da8dSAndroid Build Coastguard Worker return (stdout, stderr) 2155*cda5da8dSAndroid Build Coastguard Worker 2156*cda5da8dSAndroid Build Coastguard Worker 2157*cda5da8dSAndroid Build Coastguard Worker def _save_input(self, input): 2158*cda5da8dSAndroid Build Coastguard Worker # This method is called from the _communicate_with_*() methods 2159*cda5da8dSAndroid Build Coastguard Worker # so that if we time out while communicating, we can continue 2160*cda5da8dSAndroid Build Coastguard Worker # sending input if we retry. 2161*cda5da8dSAndroid Build Coastguard Worker if self.stdin and self._input is None: 2162*cda5da8dSAndroid Build Coastguard Worker self._input_offset = 0 2163*cda5da8dSAndroid Build Coastguard Worker self._input = input 2164*cda5da8dSAndroid Build Coastguard Worker if input is not None and self.text_mode: 2165*cda5da8dSAndroid Build Coastguard Worker self._input = self._input.encode(self.stdin.encoding, 2166*cda5da8dSAndroid Build Coastguard Worker self.stdin.errors) 2167*cda5da8dSAndroid Build Coastguard Worker 2168*cda5da8dSAndroid Build Coastguard Worker 2169*cda5da8dSAndroid Build Coastguard Worker def send_signal(self, sig): 2170*cda5da8dSAndroid Build Coastguard Worker """Send a signal to the process.""" 2171*cda5da8dSAndroid Build Coastguard Worker # bpo-38630: Polling reduces the risk of sending a signal to the 2172*cda5da8dSAndroid Build Coastguard Worker # wrong process if the process completed, the Popen.returncode 2173*cda5da8dSAndroid Build Coastguard Worker # attribute is still None, and the pid has been reassigned 2174*cda5da8dSAndroid Build Coastguard Worker # (recycled) to a new different process. This race condition can 2175*cda5da8dSAndroid Build Coastguard Worker # happens in two cases. 2176*cda5da8dSAndroid Build Coastguard Worker # 2177*cda5da8dSAndroid Build Coastguard Worker # Case 1. Thread A calls Popen.poll(), thread B calls 2178*cda5da8dSAndroid Build Coastguard Worker # Popen.send_signal(). In thread A, waitpid() succeed and returns 2179*cda5da8dSAndroid Build Coastguard Worker # the exit status. Thread B calls kill() because poll() in thread A 2180*cda5da8dSAndroid Build Coastguard Worker # did not set returncode yet. Calling poll() in thread B prevents 2181*cda5da8dSAndroid Build Coastguard Worker # the race condition thanks to Popen._waitpid_lock. 2182*cda5da8dSAndroid Build Coastguard Worker # 2183*cda5da8dSAndroid Build Coastguard Worker # Case 2. waitpid(pid, 0) has been called directly, without 2184*cda5da8dSAndroid Build Coastguard Worker # using Popen methods: returncode is still None is this case. 2185*cda5da8dSAndroid Build Coastguard Worker # Calling Popen.poll() will set returncode to a default value, 2186*cda5da8dSAndroid Build Coastguard Worker # since waitpid() fails with ProcessLookupError. 2187*cda5da8dSAndroid Build Coastguard Worker self.poll() 2188*cda5da8dSAndroid Build Coastguard Worker if self.returncode is not None: 2189*cda5da8dSAndroid Build Coastguard Worker # Skip signalling a process that we know has already died. 2190*cda5da8dSAndroid Build Coastguard Worker return 2191*cda5da8dSAndroid Build Coastguard Worker 2192*cda5da8dSAndroid Build Coastguard Worker # The race condition can still happen if the race condition 2193*cda5da8dSAndroid Build Coastguard Worker # described above happens between the returncode test 2194*cda5da8dSAndroid Build Coastguard Worker # and the kill() call. 2195*cda5da8dSAndroid Build Coastguard Worker try: 2196*cda5da8dSAndroid Build Coastguard Worker os.kill(self.pid, sig) 2197*cda5da8dSAndroid Build Coastguard Worker except ProcessLookupError: 2198*cda5da8dSAndroid Build Coastguard Worker # Suppress the race condition error; bpo-40550. 2199*cda5da8dSAndroid Build Coastguard Worker pass 2200*cda5da8dSAndroid Build Coastguard Worker 2201*cda5da8dSAndroid Build Coastguard Worker def terminate(self): 2202*cda5da8dSAndroid Build Coastguard Worker """Terminate the process with SIGTERM 2203*cda5da8dSAndroid Build Coastguard Worker """ 2204*cda5da8dSAndroid Build Coastguard Worker self.send_signal(signal.SIGTERM) 2205*cda5da8dSAndroid Build Coastguard Worker 2206*cda5da8dSAndroid Build Coastguard Worker def kill(self): 2207*cda5da8dSAndroid Build Coastguard Worker """Kill the process with SIGKILL 2208*cda5da8dSAndroid Build Coastguard Worker """ 2209*cda5da8dSAndroid Build Coastguard Worker self.send_signal(signal.SIGKILL) 2210