Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/subprocess.py: 16%

956 statements  

« prev     ^ index     » next       coverage.py v7.0.5, created at 2023-01-17 06:13 +0000

1# subprocess - Subprocesses with accessible I/O streams 

2# 

3# For more information about this module, see PEP 324. 

4# 

5# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se> 

6# 

7# Licensed to PSF under a Contributor Agreement. 

8# See http://www.python.org/2.4/license for licensing details. 

9 

10r"""Subprocesses with accessible I/O streams 

11 

12This module allows you to spawn processes, connect to their 

13input/output/error pipes, and obtain their return codes. 

14 

15For a complete description of this module see the Python documentation. 

16 

17Main API 

18======== 

19run(...): Runs a command, waits for it to complete, then returns a 

20 CompletedProcess instance. 

21Popen(...): A class for flexibly executing a command in a new process 

22 

23Constants 

24--------- 

25DEVNULL: Special value that indicates that os.devnull should be used 

26PIPE: Special value that indicates a pipe should be created 

27STDOUT: Special value that indicates that stderr should go to stdout 

28 

29 

30Older API 

31========= 

32call(...): Runs a command, waits for it to complete, then returns 

33 the return code. 

34check_call(...): Same as call() but raises CalledProcessError() 

35 if return code is not 0 

36check_output(...): Same as check_call() but returns the contents of 

37 stdout instead of a return code 

38getoutput(...): Runs a command in the shell, waits for it to complete, 

39 then returns the output 

40getstatusoutput(...): Runs a command in the shell, waits for it to complete, 

41 then returns a (exitcode, output) tuple 

42""" 

43 

44import builtins 

45import errno 

46import io 

47import os 

48import time 

49import signal 

50import sys 

51import threading 

52import warnings 

53import contextlib 

54from time import monotonic as _time 

55 

56 

57__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput", 

58 "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL", 

59 "SubprocessError", "TimeoutExpired", "CompletedProcess"] 

60 # NOTE: We intentionally exclude list2cmdline as it is 

61 # considered an internal implementation detail. issue10838. 

62 

63try: 

64 import msvcrt 

65 import _winapi 

66 _mswindows = True 

67except ModuleNotFoundError: 

68 _mswindows = False 

69 import _posixsubprocess 

70 import select 

71 import selectors 

72else: 

73 from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, 

74 STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, 

75 STD_ERROR_HANDLE, SW_HIDE, 

76 STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW, 

77 ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, 

78 HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS, 

79 NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS, 

80 CREATE_NO_WINDOW, DETACHED_PROCESS, 

81 CREATE_DEFAULT_ERROR_MODE, CREATE_BREAKAWAY_FROM_JOB) 

82 

83 __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP", 

84 "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE", 

85 "STD_ERROR_HANDLE", "SW_HIDE", 

86 "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW", 

87 "STARTUPINFO", 

88 "ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS", 

89 "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS", 

90 "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS", 

91 "CREATE_NO_WINDOW", "DETACHED_PROCESS", 

92 "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"]) 

93 

94 

95# Exception classes used by this module. 

96class SubprocessError(Exception): pass 

97 

98 

99class CalledProcessError(SubprocessError): 

100 """Raised when run() is called with check=True and the process 

101 returns a non-zero exit status. 

102 

103 Attributes: 

104 cmd, returncode, stdout, stderr, output 

105 """ 

106 def __init__(self, returncode, cmd, output=None, stderr=None): 

107 self.returncode = returncode 

108 self.cmd = cmd 

109 self.output = output 

110 self.stderr = stderr 

111 

112 def __str__(self): 

113 if self.returncode and self.returncode < 0: 

114 try: 

115 return "Command '%s' died with %r." % ( 

116 self.cmd, signal.Signals(-self.returncode)) 

117 except ValueError: 

118 return "Command '%s' died with unknown signal %d." % ( 

119 self.cmd, -self.returncode) 

120 else: 

121 return "Command '%s' returned non-zero exit status %d." % ( 

122 self.cmd, self.returncode) 

123 

124 @property 

125 def stdout(self): 

126 """Alias for output attribute, to match stderr""" 

127 return self.output 

128 

129 @stdout.setter 

130 def stdout(self, value): 

131 # There's no obvious reason to set this, but allow it anyway so 

132 # .stdout is a transparent alias for .output 

133 self.output = value 

134 

135 

136class TimeoutExpired(SubprocessError): 

137 """This exception is raised when the timeout expires while waiting for a 

138 child process. 

139 

140 Attributes: 

141 cmd, output, stdout, stderr, timeout 

142 """ 

143 def __init__(self, cmd, timeout, output=None, stderr=None): 

144 self.cmd = cmd 

145 self.timeout = timeout 

146 self.output = output 

147 self.stderr = stderr 

148 

149 def __str__(self): 

150 return ("Command '%s' timed out after %s seconds" % 

151 (self.cmd, self.timeout)) 

152 

153 @property 

154 def stdout(self): 

155 return self.output 

156 

157 @stdout.setter 

158 def stdout(self, value): 

159 # There's no obvious reason to set this, but allow it anyway so 

160 # .stdout is a transparent alias for .output 

161 self.output = value 

162 

163 

164if _mswindows: 

165 class STARTUPINFO: 

166 def __init__(self, *, dwFlags=0, hStdInput=None, hStdOutput=None, 

167 hStdError=None, wShowWindow=0, lpAttributeList=None): 

168 self.dwFlags = dwFlags 

169 self.hStdInput = hStdInput 

170 self.hStdOutput = hStdOutput 

171 self.hStdError = hStdError 

172 self.wShowWindow = wShowWindow 

173 self.lpAttributeList = lpAttributeList or {"handle_list": []} 

174 

175 def copy(self): 

176 attr_list = self.lpAttributeList.copy() 

177 if 'handle_list' in attr_list: 

178 attr_list['handle_list'] = list(attr_list['handle_list']) 

179 

180 return STARTUPINFO(dwFlags=self.dwFlags, 

181 hStdInput=self.hStdInput, 

182 hStdOutput=self.hStdOutput, 

183 hStdError=self.hStdError, 

184 wShowWindow=self.wShowWindow, 

185 lpAttributeList=attr_list) 

186 

187 

188 class Handle(int): 

189 closed = False 

190 

191 def Close(self, CloseHandle=_winapi.CloseHandle): 

192 if not self.closed: 

193 self.closed = True 

194 CloseHandle(self) 

195 

196 def Detach(self): 

197 if not self.closed: 

198 self.closed = True 

199 return int(self) 

200 raise ValueError("already closed") 

201 

202 def __repr__(self): 

203 return "%s(%d)" % (self.__class__.__name__, int(self)) 

204 

205 __del__ = Close 

206else: 

207 # When select or poll has indicated that the file is writable, 

208 # we can write up to _PIPE_BUF bytes without risk of blocking. 

209 # POSIX defines PIPE_BUF as >= 512. 

210 _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) 

211 

212 # poll/select have the advantage of not requiring any extra file 

213 # descriptor, contrarily to epoll/kqueue (also, they require a single 

214 # syscall). 

215 if hasattr(selectors, 'PollSelector'): 

216 _PopenSelector = selectors.PollSelector 

217 else: 

218 _PopenSelector = selectors.SelectSelector 

219 

220 

221if _mswindows: 

222 # On Windows we just need to close `Popen._handle` when we no longer need 

223 # it, so that the kernel can free it. `Popen._handle` gets closed 

224 # implicitly when the `Popen` instance is finalized (see `Handle.__del__`, 

225 # which is calling `CloseHandle` as requested in [1]), so there is nothing 

226 # for `_cleanup` to do. 

227 # 

228 # [1] https://docs.microsoft.com/en-us/windows/desktop/ProcThread/ 

229 # creating-processes 

230 _active = None 

231 

232 def _cleanup(): 

233 pass 

234else: 

235 # This lists holds Popen instances for which the underlying process had not 

236 # exited at the time its __del__ method got called: those processes are 

237 # wait()ed for synchronously from _cleanup() when a new Popen object is 

238 # created, to avoid zombie processes. 

239 _active = [] 

240 

241 def _cleanup(): 

242 if _active is None: 

243 return 

244 for inst in _active[:]: 

245 res = inst._internal_poll(_deadstate=sys.maxsize) 

246 if res is not None: 

247 try: 

248 _active.remove(inst) 

249 except ValueError: 

250 # This can happen if two threads create a new Popen instance. 

251 # It's harmless that it was already removed, so ignore. 

252 pass 

253 

254PIPE = -1 

255STDOUT = -2 

256DEVNULL = -3 

257 

258 

259# XXX This function is only used by multiprocessing and the test suite, 

260# but it's here so that it can be imported when Python is compiled without 

261# threads. 

262 

263def _optim_args_from_interpreter_flags(): 

264 """Return a list of command-line arguments reproducing the current 

265 optimization settings in sys.flags.""" 

266 args = [] 

267 value = sys.flags.optimize 

268 if value > 0: 

269 args.append('-' + 'O' * value) 

270 return args 

271 

272 

273def _args_from_interpreter_flags(): 

274 """Return a list of command-line arguments reproducing the current 

275 settings in sys.flags, sys.warnoptions and sys._xoptions.""" 

276 flag_opt_map = { 

277 'debug': 'd', 

278 # 'inspect': 'i', 

279 # 'interactive': 'i', 

280 'dont_write_bytecode': 'B', 

281 'no_site': 'S', 

282 'verbose': 'v', 

283 'bytes_warning': 'b', 

284 'quiet': 'q', 

285 # -O is handled in _optim_args_from_interpreter_flags() 

286 } 

287 args = _optim_args_from_interpreter_flags() 

288 for flag, opt in flag_opt_map.items(): 

289 v = getattr(sys.flags, flag) 

290 if v > 0: 

291 args.append('-' + opt * v) 

292 

293 if sys.flags.isolated: 

294 args.append('-I') 

295 else: 

296 if sys.flags.ignore_environment: 

297 args.append('-E') 

298 if sys.flags.no_user_site: 

299 args.append('-s') 

300 

301 # -W options 

302 warnopts = sys.warnoptions[:] 

303 bytes_warning = sys.flags.bytes_warning 

304 xoptions = getattr(sys, '_xoptions', {}) 

305 dev_mode = ('dev' in xoptions) 

306 

307 if bytes_warning > 1: 

308 warnopts.remove("error::BytesWarning") 

309 elif bytes_warning: 

310 warnopts.remove("default::BytesWarning") 

311 if dev_mode: 

312 warnopts.remove('default') 

313 for opt in warnopts: 

314 args.append('-W' + opt) 

315 

316 # -X options 

317 if dev_mode: 

318 args.extend(('-X', 'dev')) 

319 for opt in ('faulthandler', 'tracemalloc', 'importtime', 

320 'showalloccount', 'showrefcount', 'utf8'): 

321 if opt in xoptions: 

322 value = xoptions[opt] 

323 if value is True: 

324 arg = opt 

325 else: 

326 arg = '%s=%s' % (opt, value) 

327 args.extend(('-X', arg)) 

328 

329 return args 

330 

331 

332def call(*popenargs, timeout=None, **kwargs): 

333 """Run command with arguments. Wait for command to complete or 

334 timeout, then return the returncode attribute. 

335 

336 The arguments are the same as for the Popen constructor. Example: 

337 

338 retcode = call(["ls", "-l"]) 

339 """ 

340 with Popen(*popenargs, **kwargs) as p: 

341 try: 

342 return p.wait(timeout=timeout) 

343 except: # Including KeyboardInterrupt, wait handled that. 

344 p.kill() 

345 # We don't call p.wait() again as p.__exit__ does that for us. 

346 raise 

347 

348 

349def check_call(*popenargs, **kwargs): 

350 """Run command with arguments. Wait for command to complete. If 

351 the exit code was zero then return, otherwise raise 

352 CalledProcessError. The CalledProcessError object will have the 

353 return code in the returncode attribute. 

354 

355 The arguments are the same as for the call function. Example: 

356 

357 check_call(["ls", "-l"]) 

358 """ 

359 retcode = call(*popenargs, **kwargs) 

360 if retcode: 

361 cmd = kwargs.get("args") 

362 if cmd is None: 

363 cmd = popenargs[0] 

364 raise CalledProcessError(retcode, cmd) 

365 return 0 

366 

367 

368def check_output(*popenargs, timeout=None, **kwargs): 

369 r"""Run command with arguments and return its output. 

370 

371 If the exit code was non-zero it raises a CalledProcessError. The 

372 CalledProcessError object will have the return code in the returncode 

373 attribute and output in the output attribute. 

374 

375 The arguments are the same as for the Popen constructor. Example: 

376 

377 >>> check_output(["ls", "-l", "/dev/null"]) 

378 b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' 

379 

380 The stdout argument is not allowed as it is used internally. 

381 To capture standard error in the result, use stderr=STDOUT. 

382 

383 >>> check_output(["/bin/sh", "-c", 

384 ... "ls -l non_existent_file ; exit 0"], 

385 ... stderr=STDOUT) 

386 b'ls: non_existent_file: No such file or directory\n' 

387 

388 There is an additional optional argument, "input", allowing you to 

389 pass a string to the subprocess's stdin. If you use this argument 

390 you may not also use the Popen constructor's "stdin" argument, as 

391 it too will be used internally. Example: 

392 

393 >>> check_output(["sed", "-e", "s/foo/bar/"], 

394 ... input=b"when in the course of fooman events\n") 

395 b'when in the course of barman events\n' 

396 

397 By default, all communication is in bytes, and therefore any "input" 

398 should be bytes, and the return value will be bytes. If in text mode, 

399 any "input" should be a string, and the return value will be a string 

400 decoded according to locale encoding, or by "encoding" if set. Text mode 

401 is triggered by setting any of text, encoding, errors or universal_newlines. 

402 """ 

403 if 'stdout' in kwargs: 

404 raise ValueError('stdout argument not allowed, it will be overridden.') 

405 

406 if 'input' in kwargs and kwargs['input'] is None: 

407 # Explicitly passing input=None was previously equivalent to passing an 

408 # empty string. That is maintained here for backwards compatibility. 

409 kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b'' 

410 

411 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, 

412 **kwargs).stdout 

413 

414 

415class CompletedProcess(object): 

416 """A process that has finished running. 

417 

418 This is returned by run(). 

419 

420 Attributes: 

421 args: The list or str args passed to run(). 

422 returncode: The exit code of the process, negative for signals. 

423 stdout: The standard output (None if not captured). 

424 stderr: The standard error (None if not captured). 

425 """ 

426 def __init__(self, args, returncode, stdout=None, stderr=None): 

427 self.args = args 

428 self.returncode = returncode 

429 self.stdout = stdout 

430 self.stderr = stderr 

431 

432 def __repr__(self): 

433 args = ['args={!r}'.format(self.args), 

434 'returncode={!r}'.format(self.returncode)] 

435 if self.stdout is not None: 

436 args.append('stdout={!r}'.format(self.stdout)) 

437 if self.stderr is not None: 

438 args.append('stderr={!r}'.format(self.stderr)) 

439 return "{}({})".format(type(self).__name__, ', '.join(args)) 

440 

441 def check_returncode(self): 

442 """Raise CalledProcessError if the exit code is non-zero.""" 

443 if self.returncode: 

444 raise CalledProcessError(self.returncode, self.args, self.stdout, 

445 self.stderr) 

446 

447 

448def run(*popenargs, 

449 input=None, capture_output=False, timeout=None, check=False, **kwargs): 

450 """Run command with arguments and return a CompletedProcess instance. 

451 

452 The returned instance will have attributes args, returncode, stdout and 

453 stderr. By default, stdout and stderr are not captured, and those attributes 

454 will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them. 

455 

456 If check is True and the exit code was non-zero, it raises a 

457 CalledProcessError. The CalledProcessError object will have the return code 

458 in the returncode attribute, and output & stderr attributes if those streams 

459 were captured. 

460 

461 If timeout is given, and the process takes too long, a TimeoutExpired 

462 exception will be raised. 

463 

464 There is an optional argument "input", allowing you to 

465 pass bytes or a string to the subprocess's stdin. If you use this argument 

466 you may not also use the Popen constructor's "stdin" argument, as 

467 it will be used internally. 

468 

469 By default, all communication is in bytes, and therefore any "input" should 

470 be bytes, and the stdout and stderr will be bytes. If in text mode, any 

471 "input" should be a string, and stdout and stderr will be strings decoded 

472 according to locale encoding, or by "encoding" if set. Text mode is 

473 triggered by setting any of text, encoding, errors or universal_newlines. 

474 

475 The other arguments are the same as for the Popen constructor. 

476 """ 

477 if input is not None: 

478 if kwargs.get('stdin') is not None: 

479 raise ValueError('stdin and input arguments may not both be used.') 

480 kwargs['stdin'] = PIPE 

481 

482 if capture_output: 

483 if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None: 

484 raise ValueError('stdout and stderr arguments may not be used ' 

485 'with capture_output.') 

486 kwargs['stdout'] = PIPE 

487 kwargs['stderr'] = PIPE 

488 

489 with Popen(*popenargs, **kwargs) as process: 

490 try: 

491 stdout, stderr = process.communicate(input, timeout=timeout) 

492 except TimeoutExpired as exc: 

493 process.kill() 

494 if _mswindows: 

495 # Windows accumulates the output in a single blocking 

496 # read() call run on child threads, with the timeout 

497 # being done in a join() on those threads. communicate() 

498 # _after_ kill() is required to collect that and add it 

499 # to the exception. 

500 exc.stdout, exc.stderr = process.communicate() 

501 else: 

502 # POSIX _communicate already populated the output so 

503 # far into the TimeoutExpired exception. 

504 process.wait() 

505 raise 

506 except: # Including KeyboardInterrupt, communicate handled that. 

507 process.kill() 

508 # We don't call process.wait() as .__exit__ does that for us. 

509 raise 

510 retcode = process.poll() 

511 if check and retcode: 

512 raise CalledProcessError(retcode, process.args, 

513 output=stdout, stderr=stderr) 

514 return CompletedProcess(process.args, retcode, stdout, stderr) 

515 

516 

517def list2cmdline(seq): 

518 """ 

519 Translate a sequence of arguments into a command line 

520 string, using the same rules as the MS C runtime: 

521 

522 1) Arguments are delimited by white space, which is either a 

523 space or a tab. 

524 

525 2) A string surrounded by double quotation marks is 

526 interpreted as a single argument, regardless of white space 

527 contained within. A quoted string can be embedded in an 

528 argument. 

529 

530 3) A double quotation mark preceded by a backslash is 

531 interpreted as a literal double quotation mark. 

532 

533 4) Backslashes are interpreted literally, unless they 

534 immediately precede a double quotation mark. 

535 

536 5) If backslashes immediately precede a double quotation mark, 

537 every pair of backslashes is interpreted as a literal 

538 backslash. If the number of backslashes is odd, the last 

539 backslash escapes the next double quotation mark as 

540 described in rule 3. 

541 """ 

542 

543 # See 

544 # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx 

545 # or search http://msdn.microsoft.com for 

546 # "Parsing C++ Command-Line Arguments" 

547 result = [] 

548 needquote = False 

549 for arg in map(os.fsdecode, seq): 

550 bs_buf = [] 

551 

552 # Add a space to separate this argument from the others 

553 if result: 

554 result.append(' ') 

555 

556 needquote = (" " in arg) or ("\t" in arg) or not arg 

557 if needquote: 

558 result.append('"') 

559 

560 for c in arg: 

561 if c == '\\': 

562 # Don't know if we need to double yet. 

563 bs_buf.append(c) 

564 elif c == '"': 

565 # Double backslashes. 

566 result.append('\\' * len(bs_buf)*2) 

567 bs_buf = [] 

568 result.append('\\"') 

569 else: 

570 # Normal char 

571 if bs_buf: 

572 result.extend(bs_buf) 

573 bs_buf = [] 

574 result.append(c) 

575 

576 # Add remaining backslashes, if any. 

577 if bs_buf: 

578 result.extend(bs_buf) 

579 

580 if needquote: 

581 result.extend(bs_buf) 

582 result.append('"') 

583 

584 return ''.join(result) 

585 

586 

587# Various tools for executing commands and looking at their output and status. 

588# 

589 

590def getstatusoutput(cmd): 

591 """Return (exitcode, output) of executing cmd in a shell. 

592 

593 Execute the string 'cmd' in a shell with 'check_output' and 

594 return a 2-tuple (status, output). The locale encoding is used 

595 to decode the output and process newlines. 

596 

597 A trailing newline is stripped from the output. 

598 The exit status for the command can be interpreted 

599 according to the rules for the function 'wait'. Example: 

600 

601 >>> import subprocess 

602 >>> subprocess.getstatusoutput('ls /bin/ls') 

603 (0, '/bin/ls') 

604 >>> subprocess.getstatusoutput('cat /bin/junk') 

605 (1, 'cat: /bin/junk: No such file or directory') 

606 >>> subprocess.getstatusoutput('/bin/junk') 

607 (127, 'sh: /bin/junk: not found') 

608 >>> subprocess.getstatusoutput('/bin/kill $$') 

609 (-15, '') 

610 """ 

611 try: 

612 data = check_output(cmd, shell=True, text=True, stderr=STDOUT) 

613 exitcode = 0 

614 except CalledProcessError as ex: 

615 data = ex.output 

616 exitcode = ex.returncode 

617 if data[-1:] == '\n': 

618 data = data[:-1] 

619 return exitcode, data 

620 

621def getoutput(cmd): 

622 """Return output (stdout or stderr) of executing cmd in a shell. 

623 

624 Like getstatusoutput(), except the exit status is ignored and the return 

625 value is a string containing the command's output. Example: 

626 

627 >>> import subprocess 

628 >>> subprocess.getoutput('ls /bin/ls') 

629 '/bin/ls' 

630 """ 

631 return getstatusoutput(cmd)[1] 

632 

633 

634def _use_posix_spawn(): 

635 """Check if posix_spawn() can be used for subprocess. 

636 

637 subprocess requires a posix_spawn() implementation that properly reports 

638 errors to the parent process, & sets errno on the following failures: 

639 

640 * Process attribute actions failed. 

641 * File actions failed. 

642 * exec() failed. 

643 

644 Prefer an implementation which can use vfork() in some cases for best 

645 performance. 

646 """ 

647 if _mswindows or not hasattr(os, 'posix_spawn'): 

648 # os.posix_spawn() is not available 

649 return False 

650 

651 if sys.platform == 'darwin': 

652 # posix_spawn() is a syscall on macOS and properly reports errors 

653 return True 

654 

655 # Check libc name and runtime libc version 

656 try: 

657 ver = os.confstr('CS_GNU_LIBC_VERSION') 

658 # parse 'glibc 2.28' as ('glibc', (2, 28)) 

659 parts = ver.split(maxsplit=1) 

660 if len(parts) != 2: 

661 # reject unknown format 

662 raise ValueError 

663 libc = parts[0] 

664 version = tuple(map(int, parts[1].split('.'))) 

665 

666 if sys.platform == 'linux' and libc == 'glibc' and version >= (2, 24): 

667 # glibc 2.24 has a new Linux posix_spawn implementation using vfork 

668 # which properly reports errors to the parent process. 

669 return True 

670 # Note: Don't use the implementation in earlier glibc because it doesn't 

671 # use vfork (even if glibc 2.26 added a pipe to properly report errors 

672 # to the parent process). 

673 except (AttributeError, ValueError, OSError): 

674 # os.confstr() or CS_GNU_LIBC_VERSION value not available 

675 pass 

676 

677 # By default, assume that posix_spawn() does not properly report errors. 

678 return False 

679 

680 

681_USE_POSIX_SPAWN = _use_posix_spawn() 

682 

683 

684class Popen(object): 

685 """ Execute a child program in a new process. 

686 

687 For a complete description of the arguments see the Python documentation. 

688 

689 Arguments: 

690 args: A string, or a sequence of program arguments. 

691 

692 bufsize: supplied as the buffering argument to the open() function when 

693 creating the stdin/stdout/stderr pipe file objects 

694 

695 executable: A replacement program to execute. 

696 

697 stdin, stdout and stderr: These specify the executed programs' standard 

698 input, standard output and standard error file handles, respectively. 

699 

700 preexec_fn: (POSIX only) An object to be called in the child process 

701 just before the child is executed. 

702 

703 close_fds: Controls closing or inheriting of file descriptors. 

704 

705 shell: If true, the command will be executed through the shell. 

706 

707 cwd: Sets the current directory before the child is executed. 

708 

709 env: Defines the environment variables for the new process. 

710 

711 text: If true, decode stdin, stdout and stderr using the given encoding 

712 (if set) or the system default otherwise. 

713 

714 universal_newlines: Alias of text, provided for backwards compatibility. 

715 

716 startupinfo and creationflags (Windows only) 

717 

718 restore_signals (POSIX only) 

719 

720 start_new_session (POSIX only) 

721 

722 pass_fds (POSIX only) 

723 

724 encoding and errors: Text mode encoding and error handling to use for 

725 file objects stdin, stdout and stderr. 

726 

727 Attributes: 

728 stdin, stdout, stderr, pid, returncode 

729 """ 

730 _child_created = False # Set here since __del__ checks it 

731 

732 def __init__(self, args, bufsize=-1, executable=None, 

733 stdin=None, stdout=None, stderr=None, 

734 preexec_fn=None, close_fds=True, 

735 shell=False, cwd=None, env=None, universal_newlines=None, 

736 startupinfo=None, creationflags=0, 

737 restore_signals=True, start_new_session=False, 

738 pass_fds=(), *, encoding=None, errors=None, text=None): 

739 """Create new Popen instance.""" 

740 _cleanup() 

741 # Held while anything is calling waitpid before returncode has been 

742 # updated to prevent clobbering returncode if wait() or poll() are 

743 # called from multiple threads at once. After acquiring the lock, 

744 # code must re-check self.returncode to see if another thread just 

745 # finished a waitpid() call. 

746 self._waitpid_lock = threading.Lock() 

747 

748 self._input = None 

749 self._communication_started = False 

750 if bufsize is None: 

751 bufsize = -1 # Restore default 

752 if not isinstance(bufsize, int): 

753 raise TypeError("bufsize must be an integer") 

754 

755 if _mswindows: 

756 if preexec_fn is not None: 

757 raise ValueError("preexec_fn is not supported on Windows " 

758 "platforms") 

759 else: 

760 # POSIX 

761 if pass_fds and not close_fds: 

762 warnings.warn("pass_fds overriding close_fds.", RuntimeWarning) 

763 close_fds = True 

764 if startupinfo is not None: 

765 raise ValueError("startupinfo is only supported on Windows " 

766 "platforms") 

767 if creationflags != 0: 

768 raise ValueError("creationflags is only supported on Windows " 

769 "platforms") 

770 

771 self.args = args 

772 self.stdin = None 

773 self.stdout = None 

774 self.stderr = None 

775 self.pid = None 

776 self.returncode = None 

777 self.encoding = encoding 

778 self.errors = errors 

779 

780 # Validate the combinations of text and universal_newlines 

781 if (text is not None and universal_newlines is not None 

782 and bool(universal_newlines) != bool(text)): 

783 raise SubprocessError('Cannot disambiguate when both text ' 

784 'and universal_newlines are supplied but ' 

785 'different. Pass one or the other.') 

786 

787 # Input and output objects. The general principle is like 

788 # this: 

789 # 

790 # Parent Child 

791 # ------ ----- 

792 # p2cwrite ---stdin---> p2cread 

793 # c2pread <--stdout--- c2pwrite 

794 # errread <--stderr--- errwrite 

795 # 

796 # On POSIX, the child objects are file descriptors. On 

797 # Windows, these are Windows file handles. The parent objects 

798 # are file descriptors on both platforms. The parent objects 

799 # are -1 when not using PIPEs. The child objects are -1 

800 # when not redirecting. 

801 

802 (p2cread, p2cwrite, 

803 c2pread, c2pwrite, 

804 errread, errwrite) = self._get_handles(stdin, stdout, stderr) 

805 

806 # We wrap OS handles *before* launching the child, otherwise a 

807 # quickly terminating child could make our fds unwrappable 

808 # (see #8458). 

809 

810 if _mswindows: 

811 if p2cwrite != -1: 

812 p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0) 

813 if c2pread != -1: 

814 c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0) 

815 if errread != -1: 

816 errread = msvcrt.open_osfhandle(errread.Detach(), 0) 

817 

818 self.text_mode = encoding or errors or text or universal_newlines 

819 

820 # How long to resume waiting on a child after the first ^C. 

821 # There is no right value for this. The purpose is to be polite 

822 # yet remain good for interactive users trying to exit a tool. 

823 self._sigint_wait_secs = 0.25 # 1/xkcd221.getRandomNumber() 

824 

825 self._closed_child_pipe_fds = False 

826 

827 if self.text_mode: 

828 if bufsize == 1: 

829 line_buffering = True 

830 # Use the default buffer size for the underlying binary streams 

831 # since they don't support line buffering. 

832 bufsize = -1 

833 else: 

834 line_buffering = False 

835 

836 try: 

837 if p2cwrite != -1: 

838 self.stdin = io.open(p2cwrite, 'wb', bufsize) 

839 if self.text_mode: 

840 self.stdin = io.TextIOWrapper(self.stdin, write_through=True, 

841 line_buffering=line_buffering, 

842 encoding=encoding, errors=errors) 

843 if c2pread != -1: 

844 self.stdout = io.open(c2pread, 'rb', bufsize) 

845 if self.text_mode: 

846 self.stdout = io.TextIOWrapper(self.stdout, 

847 encoding=encoding, errors=errors) 

848 if errread != -1: 

849 self.stderr = io.open(errread, 'rb', bufsize) 

850 if self.text_mode: 

851 self.stderr = io.TextIOWrapper(self.stderr, 

852 encoding=encoding, errors=errors) 

853 

854 self._execute_child(args, executable, preexec_fn, close_fds, 

855 pass_fds, cwd, env, 

856 startupinfo, creationflags, shell, 

857 p2cread, p2cwrite, 

858 c2pread, c2pwrite, 

859 errread, errwrite, 

860 restore_signals, start_new_session) 

861 except: 

862 # Cleanup if the child failed starting. 

863 for f in filter(None, (self.stdin, self.stdout, self.stderr)): 

864 try: 

865 f.close() 

866 except OSError: 

867 pass # Ignore EBADF or other errors. 

868 

869 if not self._closed_child_pipe_fds: 

870 to_close = [] 

871 if stdin == PIPE: 

872 to_close.append(p2cread) 

873 if stdout == PIPE: 

874 to_close.append(c2pwrite) 

875 if stderr == PIPE: 

876 to_close.append(errwrite) 

877 if hasattr(self, '_devnull'): 

878 to_close.append(self._devnull) 

879 for fd in to_close: 

880 try: 

881 if _mswindows and isinstance(fd, Handle): 

882 fd.Close() 

883 else: 

884 os.close(fd) 

885 except OSError: 

886 pass 

887 

888 raise 

889 

890 @property 

891 def universal_newlines(self): 

892 # universal_newlines as retained as an alias of text_mode for API 

893 # compatibility. bpo-31756 

894 return self.text_mode 

895 

896 @universal_newlines.setter 

897 def universal_newlines(self, universal_newlines): 

898 self.text_mode = bool(universal_newlines) 

899 

900 def _translate_newlines(self, data, encoding, errors): 

901 data = data.decode(encoding, errors) 

902 return data.replace("\r\n", "\n").replace("\r", "\n") 

903 

904 def __enter__(self): 

905 return self 

906 

907 def __exit__(self, exc_type, value, traceback): 

908 if self.stdout: 

909 self.stdout.close() 

910 if self.stderr: 

911 self.stderr.close() 

912 try: # Flushing a BufferedWriter may raise an error 

913 if self.stdin: 

914 self.stdin.close() 

915 finally: 

916 if exc_type == KeyboardInterrupt: 

917 # https://bugs.python.org/issue25942 

918 # In the case of a KeyboardInterrupt we assume the SIGINT 

919 # was also already sent to our child processes. We can't 

920 # block indefinitely as that is not user friendly. 

921 # If we have not already waited a brief amount of time in 

922 # an interrupted .wait() or .communicate() call, do so here 

923 # for consistency. 

924 if self._sigint_wait_secs > 0: 

925 try: 

926 self._wait(timeout=self._sigint_wait_secs) 

927 except TimeoutExpired: 

928 pass 

929 self._sigint_wait_secs = 0 # Note that this has been done. 

930 return # resume the KeyboardInterrupt 

931 

932 # Wait for the process to terminate, to avoid zombies. 

933 self.wait() 

934 

935 def __del__(self, _maxsize=sys.maxsize, _warn=warnings.warn): 

936 if not self._child_created: 

937 # We didn't get to successfully create a child process. 

938 return 

939 if self.returncode is None: 

940 # Not reading subprocess exit status creates a zombie process which 

941 # is only destroyed at the parent python process exit 

942 _warn("subprocess %s is still running" % self.pid, 

943 ResourceWarning, source=self) 

944 # In case the child hasn't been waited on, check if it's done. 

945 self._internal_poll(_deadstate=_maxsize) 

946 if self.returncode is None and _active is not None: 

947 # Child is still running, keep us alive until we can wait on it. 

948 _active.append(self) 

949 

950 def _get_devnull(self): 

951 if not hasattr(self, '_devnull'): 

952 self._devnull = os.open(os.devnull, os.O_RDWR) 

953 return self._devnull 

954 

955 def _stdin_write(self, input): 

956 if input: 

957 try: 

958 self.stdin.write(input) 

959 except BrokenPipeError: 

960 pass # communicate() must ignore broken pipe errors. 

961 except OSError as exc: 

962 if exc.errno == errno.EINVAL: 

963 # bpo-19612, bpo-30418: On Windows, stdin.write() fails 

964 # with EINVAL if the child process exited or if the child 

965 # process is still running but closed the pipe. 

966 pass 

967 else: 

968 raise 

969 

970 try: 

971 self.stdin.close() 

972 except BrokenPipeError: 

973 pass # communicate() must ignore broken pipe errors. 

974 except OSError as exc: 

975 if exc.errno == errno.EINVAL: 

976 pass 

977 else: 

978 raise 

979 

980 def communicate(self, input=None, timeout=None): 

981 """Interact with process: Send data to stdin and close it. 

982 Read data from stdout and stderr, until end-of-file is 

983 reached. Wait for process to terminate. 

984 

985 The optional "input" argument should be data to be sent to the 

986 child process, or None, if no data should be sent to the child. 

987 communicate() returns a tuple (stdout, stderr). 

988 

989 By default, all communication is in bytes, and therefore any 

990 "input" should be bytes, and the (stdout, stderr) will be bytes. 

991 If in text mode (indicated by self.text_mode), any "input" should 

992 be a string, and (stdout, stderr) will be strings decoded 

993 according to locale encoding, or by "encoding" if set. Text mode 

994 is triggered by setting any of text, encoding, errors or 

995 universal_newlines. 

996 """ 

997 

998 if self._communication_started and input: 

999 raise ValueError("Cannot send input after starting communication") 

1000 

1001 # Optimization: If we are not worried about timeouts, we haven't 

1002 # started communicating, and we have one or zero pipes, using select() 

1003 # or threads is unnecessary. 

1004 if (timeout is None and not self._communication_started and 

1005 [self.stdin, self.stdout, self.stderr].count(None) >= 2): 

1006 stdout = None 

1007 stderr = None 

1008 if self.stdin: 

1009 self._stdin_write(input) 

1010 elif self.stdout: 

1011 stdout = self.stdout.read() 

1012 self.stdout.close() 

1013 elif self.stderr: 

1014 stderr = self.stderr.read() 

1015 self.stderr.close() 

1016 self.wait() 

1017 else: 

1018 if timeout is not None: 

1019 endtime = _time() + timeout 

1020 else: 

1021 endtime = None 

1022 

1023 try: 

1024 stdout, stderr = self._communicate(input, endtime, timeout) 

1025 except KeyboardInterrupt: 

1026 # https://bugs.python.org/issue25942 

1027 # See the detailed comment in .wait(). 

1028 if timeout is not None: 

1029 sigint_timeout = min(self._sigint_wait_secs, 

1030 self._remaining_time(endtime)) 

1031 else: 

1032 sigint_timeout = self._sigint_wait_secs 

1033 self._sigint_wait_secs = 0 # nothing else should wait. 

1034 try: 

1035 self._wait(timeout=sigint_timeout) 

1036 except TimeoutExpired: 

1037 pass 

1038 raise # resume the KeyboardInterrupt 

1039 

1040 finally: 

1041 self._communication_started = True 

1042 

1043 sts = self.wait(timeout=self._remaining_time(endtime)) 

1044 

1045 return (stdout, stderr) 

1046 

1047 

1048 def poll(self): 

1049 """Check if child process has terminated. Set and return returncode 

1050 attribute.""" 

1051 return self._internal_poll() 

1052 

1053 

1054 def _remaining_time(self, endtime): 

1055 """Convenience for _communicate when computing timeouts.""" 

1056 if endtime is None: 

1057 return None 

1058 else: 

1059 return endtime - _time() 

1060 

1061 

1062 def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq, 

1063 skip_check_and_raise=False): 

1064 """Convenience for checking if a timeout has expired.""" 

1065 if endtime is None: 

1066 return 

1067 if skip_check_and_raise or _time() > endtime: 

1068 raise TimeoutExpired( 

1069 self.args, orig_timeout, 

1070 output=b''.join(stdout_seq) if stdout_seq else None, 

1071 stderr=b''.join(stderr_seq) if stderr_seq else None) 

1072 

1073 

1074 def wait(self, timeout=None): 

1075 """Wait for child process to terminate; returns self.returncode.""" 

1076 if timeout is not None: 

1077 endtime = _time() + timeout 

1078 try: 

1079 return self._wait(timeout=timeout) 

1080 except KeyboardInterrupt: 

1081 # https://bugs.python.org/issue25942 

1082 # The first keyboard interrupt waits briefly for the child to 

1083 # exit under the common assumption that it also received the ^C 

1084 # generated SIGINT and will exit rapidly. 

1085 if timeout is not None: 

1086 sigint_timeout = min(self._sigint_wait_secs, 

1087 self._remaining_time(endtime)) 

1088 else: 

1089 sigint_timeout = self._sigint_wait_secs 

1090 self._sigint_wait_secs = 0 # nothing else should wait. 

1091 try: 

1092 self._wait(timeout=sigint_timeout) 

1093 except TimeoutExpired: 

1094 pass 

1095 raise # resume the KeyboardInterrupt 

1096 

1097 def _close_pipe_fds(self, 

1098 p2cread, p2cwrite, 

1099 c2pread, c2pwrite, 

1100 errread, errwrite): 

1101 # self._devnull is not always defined. 

1102 devnull_fd = getattr(self, '_devnull', None) 

1103 

1104 with contextlib.ExitStack() as stack: 

1105 if _mswindows: 

1106 if p2cread != -1: 

1107 stack.callback(p2cread.Close) 

1108 if c2pwrite != -1: 

1109 stack.callback(c2pwrite.Close) 

1110 if errwrite != -1: 

1111 stack.callback(errwrite.Close) 

1112 else: 

1113 if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd: 

1114 stack.callback(os.close, p2cread) 

1115 if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd: 

1116 stack.callback(os.close, c2pwrite) 

1117 if errwrite != -1 and errread != -1 and errwrite != devnull_fd: 

1118 stack.callback(os.close, errwrite) 

1119 

1120 if devnull_fd is not None: 

1121 stack.callback(os.close, devnull_fd) 

1122 

1123 # Prevent a double close of these handles/fds from __init__ on error. 

1124 self._closed_child_pipe_fds = True 

1125 

1126 if _mswindows: 

1127 # 

1128 # Windows methods 

1129 # 

1130 def _get_handles(self, stdin, stdout, stderr): 

1131 """Construct and return tuple with IO objects: 

1132 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite 

1133 """ 

1134 if stdin is None and stdout is None and stderr is None: 

1135 return (-1, -1, -1, -1, -1, -1) 

1136 

1137 p2cread, p2cwrite = -1, -1 

1138 c2pread, c2pwrite = -1, -1 

1139 errread, errwrite = -1, -1 

1140 

1141 if stdin is None: 

1142 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE) 

1143 if p2cread is None: 

1144 p2cread, _ = _winapi.CreatePipe(None, 0) 

1145 p2cread = Handle(p2cread) 

1146 _winapi.CloseHandle(_) 

1147 elif stdin == PIPE: 

1148 p2cread, p2cwrite = _winapi.CreatePipe(None, 0) 

1149 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite) 

1150 elif stdin == DEVNULL: 

1151 p2cread = msvcrt.get_osfhandle(self._get_devnull()) 

1152 elif isinstance(stdin, int): 

1153 p2cread = msvcrt.get_osfhandle(stdin) 

1154 else: 

1155 # Assuming file-like object 

1156 p2cread = msvcrt.get_osfhandle(stdin.fileno()) 

1157 p2cread = self._make_inheritable(p2cread) 

1158 

1159 if stdout is None: 

1160 c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE) 

1161 if c2pwrite is None: 

1162 _, c2pwrite = _winapi.CreatePipe(None, 0) 

1163 c2pwrite = Handle(c2pwrite) 

1164 _winapi.CloseHandle(_) 

1165 elif stdout == PIPE: 

1166 c2pread, c2pwrite = _winapi.CreatePipe(None, 0) 

1167 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite) 

1168 elif stdout == DEVNULL: 

1169 c2pwrite = msvcrt.get_osfhandle(self._get_devnull()) 

1170 elif isinstance(stdout, int): 

1171 c2pwrite = msvcrt.get_osfhandle(stdout) 

1172 else: 

1173 # Assuming file-like object 

1174 c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) 

1175 c2pwrite = self._make_inheritable(c2pwrite) 

1176 

1177 if stderr is None: 

1178 errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE) 

1179 if errwrite is None: 

1180 _, errwrite = _winapi.CreatePipe(None, 0) 

1181 errwrite = Handle(errwrite) 

1182 _winapi.CloseHandle(_) 

1183 elif stderr == PIPE: 

1184 errread, errwrite = _winapi.CreatePipe(None, 0) 

1185 errread, errwrite = Handle(errread), Handle(errwrite) 

1186 elif stderr == STDOUT: 

1187 errwrite = c2pwrite 

1188 elif stderr == DEVNULL: 

1189 errwrite = msvcrt.get_osfhandle(self._get_devnull()) 

1190 elif isinstance(stderr, int): 

1191 errwrite = msvcrt.get_osfhandle(stderr) 

1192 else: 

1193 # Assuming file-like object 

1194 errwrite = msvcrt.get_osfhandle(stderr.fileno()) 

1195 errwrite = self._make_inheritable(errwrite) 

1196 

1197 return (p2cread, p2cwrite, 

1198 c2pread, c2pwrite, 

1199 errread, errwrite) 

1200 

1201 

1202 def _make_inheritable(self, handle): 

1203 """Return a duplicate of handle, which is inheritable""" 

1204 h = _winapi.DuplicateHandle( 

1205 _winapi.GetCurrentProcess(), handle, 

1206 _winapi.GetCurrentProcess(), 0, 1, 

1207 _winapi.DUPLICATE_SAME_ACCESS) 

1208 return Handle(h) 

1209 

1210 

1211 def _filter_handle_list(self, handle_list): 

1212 """Filter out console handles that can't be used 

1213 in lpAttributeList["handle_list"] and make sure the list 

1214 isn't empty. This also removes duplicate handles.""" 

1215 # An handle with it's lowest two bits set might be a special console 

1216 # handle that if passed in lpAttributeList["handle_list"], will 

1217 # cause it to fail. 

1218 return list({handle for handle in handle_list 

1219 if handle & 0x3 != 0x3 

1220 or _winapi.GetFileType(handle) != 

1221 _winapi.FILE_TYPE_CHAR}) 

1222 

1223 

1224 def _execute_child(self, args, executable, preexec_fn, close_fds, 

1225 pass_fds, cwd, env, 

1226 startupinfo, creationflags, shell, 

1227 p2cread, p2cwrite, 

1228 c2pread, c2pwrite, 

1229 errread, errwrite, 

1230 unused_restore_signals, unused_start_new_session): 

1231 """Execute program (MS Windows version)""" 

1232 

1233 assert not pass_fds, "pass_fds not supported on Windows." 

1234 

1235 if isinstance(args, str): 

1236 pass 

1237 elif isinstance(args, bytes): 

1238 if shell: 

1239 raise TypeError('bytes args is not allowed on Windows') 

1240 args = list2cmdline([args]) 

1241 elif isinstance(args, os.PathLike): 

1242 if shell: 

1243 raise TypeError('path-like args is not allowed when ' 

1244 'shell is true') 

1245 args = list2cmdline([args]) 

1246 else: 

1247 args = list2cmdline(args) 

1248 

1249 if executable is not None: 

1250 executable = os.fsdecode(executable) 

1251 

1252 # Process startup details 

1253 if startupinfo is None: 

1254 startupinfo = STARTUPINFO() 

1255 else: 

1256 # bpo-34044: Copy STARTUPINFO since it is modified above, 

1257 # so the caller can reuse it multiple times. 

1258 startupinfo = startupinfo.copy() 

1259 

1260 use_std_handles = -1 not in (p2cread, c2pwrite, errwrite) 

1261 if use_std_handles: 

1262 startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES 

1263 startupinfo.hStdInput = p2cread 

1264 startupinfo.hStdOutput = c2pwrite 

1265 startupinfo.hStdError = errwrite 

1266 

1267 attribute_list = startupinfo.lpAttributeList 

1268 have_handle_list = bool(attribute_list and 

1269 "handle_list" in attribute_list and 

1270 attribute_list["handle_list"]) 

1271 

1272 # If we were given an handle_list or need to create one 

1273 if have_handle_list or (use_std_handles and close_fds): 

1274 if attribute_list is None: 

1275 attribute_list = startupinfo.lpAttributeList = {} 

1276 handle_list = attribute_list["handle_list"] = \ 

1277 list(attribute_list.get("handle_list", [])) 

1278 

1279 if use_std_handles: 

1280 handle_list += [int(p2cread), int(c2pwrite), int(errwrite)] 

1281 

1282 handle_list[:] = self._filter_handle_list(handle_list) 

1283 

1284 if handle_list: 

1285 if not close_fds: 

1286 warnings.warn("startupinfo.lpAttributeList['handle_list'] " 

1287 "overriding close_fds", RuntimeWarning) 

1288 

1289 # When using the handle_list we always request to inherit 

1290 # handles but the only handles that will be inherited are 

1291 # the ones in the handle_list 

1292 close_fds = False 

1293 

1294 if shell: 

1295 startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW 

1296 startupinfo.wShowWindow = _winapi.SW_HIDE 

1297 comspec = os.environ.get("COMSPEC", "cmd.exe") 

1298 args = '{} /c "{}"'.format (comspec, args) 

1299 

1300 if cwd is not None: 

1301 cwd = os.fsdecode(cwd) 

1302 

1303 sys.audit("subprocess.Popen", executable, args, cwd, env) 

1304 

1305 # Start the process 

1306 try: 

1307 hp, ht, pid, tid = _winapi.CreateProcess(executable, args, 

1308 # no special security 

1309 None, None, 

1310 int(not close_fds), 

1311 creationflags, 

1312 env, 

1313 cwd, 

1314 startupinfo) 

1315 finally: 

1316 # Child is launched. Close the parent's copy of those pipe 

1317 # handles that only the child should have open. You need 

1318 # to make sure that no handles to the write end of the 

1319 # output pipe are maintained in this process or else the 

1320 # pipe will not close when the child process exits and the 

1321 # ReadFile will hang. 

1322 self._close_pipe_fds(p2cread, p2cwrite, 

1323 c2pread, c2pwrite, 

1324 errread, errwrite) 

1325 

1326 # Retain the process handle, but close the thread handle 

1327 self._child_created = True 

1328 self._handle = Handle(hp) 

1329 self.pid = pid 

1330 _winapi.CloseHandle(ht) 

1331 

1332 def _internal_poll(self, _deadstate=None, 

1333 _WaitForSingleObject=_winapi.WaitForSingleObject, 

1334 _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0, 

1335 _GetExitCodeProcess=_winapi.GetExitCodeProcess): 

1336 """Check if child process has terminated. Returns returncode 

1337 attribute. 

1338 

1339 This method is called by __del__, so it can only refer to objects 

1340 in its local scope. 

1341 

1342 """ 

1343 if self.returncode is None: 

1344 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0: 

1345 self.returncode = _GetExitCodeProcess(self._handle) 

1346 return self.returncode 

1347 

1348 

1349 def _wait(self, timeout): 

1350 """Internal implementation of wait() on Windows.""" 

1351 if timeout is None: 

1352 timeout_millis = _winapi.INFINITE 

1353 else: 

1354 timeout_millis = int(timeout * 1000) 

1355 if self.returncode is None: 

1356 # API note: Returns immediately if timeout_millis == 0. 

1357 result = _winapi.WaitForSingleObject(self._handle, 

1358 timeout_millis) 

1359 if result == _winapi.WAIT_TIMEOUT: 

1360 raise TimeoutExpired(self.args, timeout) 

1361 self.returncode = _winapi.GetExitCodeProcess(self._handle) 

1362 return self.returncode 

1363 

1364 

1365 def _readerthread(self, fh, buffer): 

1366 buffer.append(fh.read()) 

1367 fh.close() 

1368 

1369 

1370 def _communicate(self, input, endtime, orig_timeout): 

1371 # Start reader threads feeding into a list hanging off of this 

1372 # object, unless they've already been started. 

1373 if self.stdout and not hasattr(self, "_stdout_buff"): 

1374 self._stdout_buff = [] 

1375 self.stdout_thread = \ 

1376 threading.Thread(target=self._readerthread, 

1377 args=(self.stdout, self._stdout_buff)) 

1378 self.stdout_thread.daemon = True 

1379 self.stdout_thread.start() 

1380 if self.stderr and not hasattr(self, "_stderr_buff"): 

1381 self._stderr_buff = [] 

1382 self.stderr_thread = \ 

1383 threading.Thread(target=self._readerthread, 

1384 args=(self.stderr, self._stderr_buff)) 

1385 self.stderr_thread.daemon = True 

1386 self.stderr_thread.start() 

1387 

1388 if self.stdin: 

1389 self._stdin_write(input) 

1390 

1391 # Wait for the reader threads, or time out. If we time out, the 

1392 # threads remain reading and the fds left open in case the user 

1393 # calls communicate again. 

1394 if self.stdout is not None: 

1395 self.stdout_thread.join(self._remaining_time(endtime)) 

1396 if self.stdout_thread.is_alive(): 

1397 raise TimeoutExpired(self.args, orig_timeout) 

1398 if self.stderr is not None: 

1399 self.stderr_thread.join(self._remaining_time(endtime)) 

1400 if self.stderr_thread.is_alive(): 

1401 raise TimeoutExpired(self.args, orig_timeout) 

1402 

1403 # Collect the output from and close both pipes, now that we know 

1404 # both have been read successfully. 

1405 stdout = None 

1406 stderr = None 

1407 if self.stdout: 

1408 stdout = self._stdout_buff 

1409 self.stdout.close() 

1410 if self.stderr: 

1411 stderr = self._stderr_buff 

1412 self.stderr.close() 

1413 

1414 # All data exchanged. Translate lists into strings. 

1415 if stdout is not None: 

1416 stdout = stdout[0] 

1417 if stderr is not None: 

1418 stderr = stderr[0] 

1419 

1420 return (stdout, stderr) 

1421 

1422 def send_signal(self, sig): 

1423 """Send a signal to the process.""" 

1424 # Don't signal a process that we know has already died. 

1425 if self.returncode is not None: 

1426 return 

1427 if sig == signal.SIGTERM: 

1428 self.terminate() 

1429 elif sig == signal.CTRL_C_EVENT: 

1430 os.kill(self.pid, signal.CTRL_C_EVENT) 

1431 elif sig == signal.CTRL_BREAK_EVENT: 

1432 os.kill(self.pid, signal.CTRL_BREAK_EVENT) 

1433 else: 

1434 raise ValueError("Unsupported signal: {}".format(sig)) 

1435 

1436 def terminate(self): 

1437 """Terminates the process.""" 

1438 # Don't terminate a process that we know has already died. 

1439 if self.returncode is not None: 

1440 return 

1441 try: 

1442 _winapi.TerminateProcess(self._handle, 1) 

1443 except PermissionError: 

1444 # ERROR_ACCESS_DENIED (winerror 5) is received when the 

1445 # process already died. 

1446 rc = _winapi.GetExitCodeProcess(self._handle) 

1447 if rc == _winapi.STILL_ACTIVE: 

1448 raise 

1449 self.returncode = rc 

1450 

1451 kill = terminate 

1452 

1453 else: 

1454 # 

1455 # POSIX methods 

1456 # 

1457 def _get_handles(self, stdin, stdout, stderr): 

1458 """Construct and return tuple with IO objects: 

1459 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite 

1460 """ 

1461 p2cread, p2cwrite = -1, -1 

1462 c2pread, c2pwrite = -1, -1 

1463 errread, errwrite = -1, -1 

1464 

1465 if stdin is None: 

1466 pass 

1467 elif stdin == PIPE: 

1468 p2cread, p2cwrite = os.pipe() 

1469 elif stdin == DEVNULL: 

1470 p2cread = self._get_devnull() 

1471 elif isinstance(stdin, int): 

1472 p2cread = stdin 

1473 else: 

1474 # Assuming file-like object 

1475 p2cread = stdin.fileno() 

1476 

1477 if stdout is None: 

1478 pass 

1479 elif stdout == PIPE: 

1480 c2pread, c2pwrite = os.pipe() 

1481 elif stdout == DEVNULL: 

1482 c2pwrite = self._get_devnull() 

1483 elif isinstance(stdout, int): 

1484 c2pwrite = stdout 

1485 else: 

1486 # Assuming file-like object 

1487 c2pwrite = stdout.fileno() 

1488 

1489 if stderr is None: 

1490 pass 

1491 elif stderr == PIPE: 

1492 errread, errwrite = os.pipe() 

1493 elif stderr == STDOUT: 

1494 if c2pwrite != -1: 

1495 errwrite = c2pwrite 

1496 else: # child's stdout is not set, use parent's stdout 

1497 errwrite = sys.__stdout__.fileno() 

1498 elif stderr == DEVNULL: 

1499 errwrite = self._get_devnull() 

1500 elif isinstance(stderr, int): 

1501 errwrite = stderr 

1502 else: 

1503 # Assuming file-like object 

1504 errwrite = stderr.fileno() 

1505 

1506 return (p2cread, p2cwrite, 

1507 c2pread, c2pwrite, 

1508 errread, errwrite) 

1509 

1510 

1511 def _posix_spawn(self, args, executable, env, restore_signals, 

1512 p2cread, p2cwrite, 

1513 c2pread, c2pwrite, 

1514 errread, errwrite): 

1515 """Execute program using os.posix_spawn().""" 

1516 if env is None: 

1517 env = os.environ 

1518 

1519 kwargs = {} 

1520 if restore_signals: 

1521 # See _Py_RestoreSignals() in Python/pylifecycle.c 

1522 sigset = [] 

1523 for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'): 

1524 signum = getattr(signal, signame, None) 

1525 if signum is not None: 

1526 sigset.append(signum) 

1527 kwargs['setsigdef'] = sigset 

1528 

1529 file_actions = [] 

1530 for fd in (p2cwrite, c2pread, errread): 

1531 if fd != -1: 

1532 file_actions.append((os.POSIX_SPAWN_CLOSE, fd)) 

1533 for fd, fd2 in ( 

1534 (p2cread, 0), 

1535 (c2pwrite, 1), 

1536 (errwrite, 2), 

1537 ): 

1538 if fd != -1: 

1539 file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2)) 

1540 if file_actions: 

1541 kwargs['file_actions'] = file_actions 

1542 

1543 self.pid = os.posix_spawn(executable, args, env, **kwargs) 

1544 self._child_created = True 

1545 

1546 self._close_pipe_fds(p2cread, p2cwrite, 

1547 c2pread, c2pwrite, 

1548 errread, errwrite) 

1549 

1550 def _execute_child(self, args, executable, preexec_fn, close_fds, 

1551 pass_fds, cwd, env, 

1552 startupinfo, creationflags, shell, 

1553 p2cread, p2cwrite, 

1554 c2pread, c2pwrite, 

1555 errread, errwrite, 

1556 restore_signals, start_new_session): 

1557 """Execute program (POSIX version)""" 

1558 

1559 if isinstance(args, (str, bytes)): 

1560 args = [args] 

1561 elif isinstance(args, os.PathLike): 

1562 if shell: 

1563 raise TypeError('path-like args is not allowed when ' 

1564 'shell is true') 

1565 args = [args] 

1566 else: 

1567 args = list(args) 

1568 

1569 if shell: 

1570 # On Android the default shell is at '/system/bin/sh'. 

1571 unix_shell = ('/system/bin/sh' if 

1572 hasattr(sys, 'getandroidapilevel') else '/bin/sh') 

1573 args = [unix_shell, "-c"] + args 

1574 if executable: 

1575 args[0] = executable 

1576 

1577 if executable is None: 

1578 executable = args[0] 

1579 

1580 sys.audit("subprocess.Popen", executable, args, cwd, env) 

1581 

1582 if (_USE_POSIX_SPAWN 

1583 and os.path.dirname(executable) 

1584 and preexec_fn is None 

1585 and not close_fds 

1586 and not pass_fds 

1587 and cwd is None 

1588 and (p2cread == -1 or p2cread > 2) 

1589 and (c2pwrite == -1 or c2pwrite > 2) 

1590 and (errwrite == -1 or errwrite > 2) 

1591 and not start_new_session): 

1592 self._posix_spawn(args, executable, env, restore_signals, 

1593 p2cread, p2cwrite, 

1594 c2pread, c2pwrite, 

1595 errread, errwrite) 

1596 return 

1597 

1598 orig_executable = executable 

1599 

1600 # For transferring possible exec failure from child to parent. 

1601 # Data format: "exception name:hex errno:description" 

1602 # Pickle is not used; it is complex and involves memory allocation. 

1603 errpipe_read, errpipe_write = os.pipe() 

1604 # errpipe_write must not be in the standard io 0, 1, or 2 fd range. 

1605 low_fds_to_close = [] 

1606 while errpipe_write < 3: 

1607 low_fds_to_close.append(errpipe_write) 

1608 errpipe_write = os.dup(errpipe_write) 

1609 for low_fd in low_fds_to_close: 

1610 os.close(low_fd) 

1611 try: 

1612 try: 

1613 # We must avoid complex work that could involve 

1614 # malloc or free in the child process to avoid 

1615 # potential deadlocks, thus we do all this here. 

1616 # and pass it to fork_exec() 

1617 

1618 if env is not None: 

1619 env_list = [] 

1620 for k, v in env.items(): 

1621 k = os.fsencode(k) 

1622 if b'=' in k: 

1623 raise ValueError("illegal environment variable name") 

1624 env_list.append(k + b'=' + os.fsencode(v)) 

1625 else: 

1626 env_list = None # Use execv instead of execve. 

1627 executable = os.fsencode(executable) 

1628 if os.path.dirname(executable): 

1629 executable_list = (executable,) 

1630 else: 

1631 # This matches the behavior of os._execvpe(). 

1632 executable_list = tuple( 

1633 os.path.join(os.fsencode(dir), executable) 

1634 for dir in os.get_exec_path(env)) 

1635 fds_to_keep = set(pass_fds) 

1636 fds_to_keep.add(errpipe_write) 

1637 self.pid = _posixsubprocess.fork_exec( 

1638 args, executable_list, 

1639 close_fds, tuple(sorted(map(int, fds_to_keep))), 

1640 cwd, env_list, 

1641 p2cread, p2cwrite, c2pread, c2pwrite, 

1642 errread, errwrite, 

1643 errpipe_read, errpipe_write, 

1644 restore_signals, start_new_session, preexec_fn) 

1645 self._child_created = True 

1646 finally: 

1647 # be sure the FD is closed no matter what 

1648 os.close(errpipe_write) 

1649 

1650 self._close_pipe_fds(p2cread, p2cwrite, 

1651 c2pread, c2pwrite, 

1652 errread, errwrite) 

1653 

1654 # Wait for exec to fail or succeed; possibly raising an 

1655 # exception (limited in size) 

1656 errpipe_data = bytearray() 

1657 while True: 

1658 part = os.read(errpipe_read, 50000) 

1659 errpipe_data += part 

1660 if not part or len(errpipe_data) > 50000: 

1661 break 

1662 finally: 

1663 # be sure the FD is closed no matter what 

1664 os.close(errpipe_read) 

1665 

1666 if errpipe_data: 

1667 try: 

1668 pid, sts = os.waitpid(self.pid, 0) 

1669 if pid == self.pid: 

1670 self._handle_exitstatus(sts) 

1671 else: 

1672 self.returncode = sys.maxsize 

1673 except ChildProcessError: 

1674 pass 

1675 

1676 try: 

1677 exception_name, hex_errno, err_msg = ( 

1678 errpipe_data.split(b':', 2)) 

1679 # The encoding here should match the encoding 

1680 # written in by the subprocess implementations 

1681 # like _posixsubprocess 

1682 err_msg = err_msg.decode() 

1683 except ValueError: 

1684 exception_name = b'SubprocessError' 

1685 hex_errno = b'0' 

1686 err_msg = 'Bad exception data from child: {!r}'.format( 

1687 bytes(errpipe_data)) 

1688 child_exception_type = getattr( 

1689 builtins, exception_name.decode('ascii'), 

1690 SubprocessError) 

1691 if issubclass(child_exception_type, OSError) and hex_errno: 

1692 errno_num = int(hex_errno, 16) 

1693 child_exec_never_called = (err_msg == "noexec") 

1694 if child_exec_never_called: 

1695 err_msg = "" 

1696 # The error must be from chdir(cwd). 

1697 err_filename = cwd 

1698 else: 

1699 err_filename = orig_executable 

1700 if errno_num != 0: 

1701 err_msg = os.strerror(errno_num) 

1702 raise child_exception_type(errno_num, err_msg, err_filename) 

1703 raise child_exception_type(err_msg) 

1704 

1705 

1706 def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED, 

1707 _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED, 

1708 _WEXITSTATUS=os.WEXITSTATUS, _WIFSTOPPED=os.WIFSTOPPED, 

1709 _WSTOPSIG=os.WSTOPSIG): 

1710 """All callers to this function MUST hold self._waitpid_lock.""" 

1711 # This method is called (indirectly) by __del__, so it cannot 

1712 # refer to anything outside of its local scope. 

1713 if _WIFSIGNALED(sts): 

1714 self.returncode = -_WTERMSIG(sts) 

1715 elif _WIFEXITED(sts): 

1716 self.returncode = _WEXITSTATUS(sts) 

1717 elif _WIFSTOPPED(sts): 

1718 self.returncode = -_WSTOPSIG(sts) 

1719 else: 

1720 # Should never happen 

1721 raise SubprocessError("Unknown child exit status!") 

1722 

1723 

1724 def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, 

1725 _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD): 

1726 """Check if child process has terminated. Returns returncode 

1727 attribute. 

1728 

1729 This method is called by __del__, so it cannot reference anything 

1730 outside of the local scope (nor can any methods it calls). 

1731 

1732 """ 

1733 if self.returncode is None: 

1734 if not self._waitpid_lock.acquire(False): 

1735 # Something else is busy calling waitpid. Don't allow two 

1736 # at once. We know nothing yet. 

1737 return None 

1738 try: 

1739 if self.returncode is not None: 

1740 return self.returncode # Another thread waited. 

1741 pid, sts = _waitpid(self.pid, _WNOHANG) 

1742 if pid == self.pid: 

1743 self._handle_exitstatus(sts) 

1744 except OSError as e: 

1745 if _deadstate is not None: 

1746 self.returncode = _deadstate 

1747 elif e.errno == _ECHILD: 

1748 # This happens if SIGCLD is set to be ignored or 

1749 # waiting for child processes has otherwise been 

1750 # disabled for our process. This child is dead, we 

1751 # can't get the status. 

1752 # http://bugs.python.org/issue15756 

1753 self.returncode = 0 

1754 finally: 

1755 self._waitpid_lock.release() 

1756 return self.returncode 

1757 

1758 

1759 def _try_wait(self, wait_flags): 

1760 """All callers to this function MUST hold self._waitpid_lock.""" 

1761 try: 

1762 (pid, sts) = os.waitpid(self.pid, wait_flags) 

1763 except ChildProcessError: 

1764 # This happens if SIGCLD is set to be ignored or waiting 

1765 # for child processes has otherwise been disabled for our 

1766 # process. This child is dead, we can't get the status. 

1767 pid = self.pid 

1768 sts = 0 

1769 return (pid, sts) 

1770 

1771 

1772 def _wait(self, timeout): 

1773 """Internal implementation of wait() on POSIX.""" 

1774 if self.returncode is not None: 

1775 return self.returncode 

1776 

1777 if timeout is not None: 

1778 endtime = _time() + timeout 

1779 # Enter a busy loop if we have a timeout. This busy loop was 

1780 # cribbed from Lib/threading.py in Thread.wait() at r71065. 

1781 delay = 0.0005 # 500 us -> initial delay of 1 ms 

1782 while True: 

1783 if self._waitpid_lock.acquire(False): 

1784 try: 

1785 if self.returncode is not None: 

1786 break # Another thread waited. 

1787 (pid, sts) = self._try_wait(os.WNOHANG) 

1788 assert pid == self.pid or pid == 0 

1789 if pid == self.pid: 

1790 self._handle_exitstatus(sts) 

1791 break 

1792 finally: 

1793 self._waitpid_lock.release() 

1794 remaining = self._remaining_time(endtime) 

1795 if remaining <= 0: 

1796 raise TimeoutExpired(self.args, timeout) 

1797 delay = min(delay * 2, remaining, .05) 

1798 time.sleep(delay) 

1799 else: 

1800 while self.returncode is None: 

1801 with self._waitpid_lock: 

1802 if self.returncode is not None: 

1803 break # Another thread waited. 

1804 (pid, sts) = self._try_wait(0) 

1805 # Check the pid and loop as waitpid has been known to 

1806 # return 0 even without WNOHANG in odd situations. 

1807 # http://bugs.python.org/issue14396. 

1808 if pid == self.pid: 

1809 self._handle_exitstatus(sts) 

1810 return self.returncode 

1811 

1812 

1813 def _communicate(self, input, endtime, orig_timeout): 

1814 if self.stdin and not self._communication_started: 

1815 # Flush stdio buffer. This might block, if the user has 

1816 # been writing to .stdin in an uncontrolled fashion. 

1817 try: 

1818 self.stdin.flush() 

1819 except BrokenPipeError: 

1820 pass # communicate() must ignore BrokenPipeError. 

1821 if not input: 

1822 try: 

1823 self.stdin.close() 

1824 except BrokenPipeError: 

1825 pass # communicate() must ignore BrokenPipeError. 

1826 

1827 stdout = None 

1828 stderr = None 

1829 

1830 # Only create this mapping if we haven't already. 

1831 if not self._communication_started: 

1832 self._fileobj2output = {} 

1833 if self.stdout: 

1834 self._fileobj2output[self.stdout] = [] 

1835 if self.stderr: 

1836 self._fileobj2output[self.stderr] = [] 

1837 

1838 if self.stdout: 

1839 stdout = self._fileobj2output[self.stdout] 

1840 if self.stderr: 

1841 stderr = self._fileobj2output[self.stderr] 

1842 

1843 self._save_input(input) 

1844 

1845 if self._input: 

1846 input_view = memoryview(self._input) 

1847 

1848 with _PopenSelector() as selector: 

1849 if self.stdin and input: 

1850 selector.register(self.stdin, selectors.EVENT_WRITE) 

1851 if self.stdout and not self.stdout.closed: 

1852 selector.register(self.stdout, selectors.EVENT_READ) 

1853 if self.stderr and not self.stderr.closed: 

1854 selector.register(self.stderr, selectors.EVENT_READ) 

1855 

1856 while selector.get_map(): 

1857 timeout = self._remaining_time(endtime) 

1858 if timeout is not None and timeout < 0: 

1859 self._check_timeout(endtime, orig_timeout, 

1860 stdout, stderr, 

1861 skip_check_and_raise=True) 

1862 raise RuntimeError( # Impossible :) 

1863 '_check_timeout(..., skip_check_and_raise=True) ' 

1864 'failed to raise TimeoutExpired.') 

1865 

1866 ready = selector.select(timeout) 

1867 self._check_timeout(endtime, orig_timeout, stdout, stderr) 

1868 

1869 # XXX Rewrite these to use non-blocking I/O on the file 

1870 # objects; they are no longer using C stdio! 

1871 

1872 for key, events in ready: 

1873 if key.fileobj is self.stdin: 

1874 chunk = input_view[self._input_offset : 

1875 self._input_offset + _PIPE_BUF] 

1876 try: 

1877 self._input_offset += os.write(key.fd, chunk) 

1878 except BrokenPipeError: 

1879 selector.unregister(key.fileobj) 

1880 key.fileobj.close() 

1881 else: 

1882 if self._input_offset >= len(self._input): 

1883 selector.unregister(key.fileobj) 

1884 key.fileobj.close() 

1885 elif key.fileobj in (self.stdout, self.stderr): 

1886 data = os.read(key.fd, 32768) 

1887 if not data: 

1888 selector.unregister(key.fileobj) 

1889 key.fileobj.close() 

1890 self._fileobj2output[key.fileobj].append(data) 

1891 

1892 self.wait(timeout=self._remaining_time(endtime)) 

1893 

1894 # All data exchanged. Translate lists into strings. 

1895 if stdout is not None: 

1896 stdout = b''.join(stdout) 

1897 if stderr is not None: 

1898 stderr = b''.join(stderr) 

1899 

1900 # Translate newlines, if requested. 

1901 # This also turns bytes into strings. 

1902 if self.text_mode: 

1903 if stdout is not None: 

1904 stdout = self._translate_newlines(stdout, 

1905 self.stdout.encoding, 

1906 self.stdout.errors) 

1907 if stderr is not None: 

1908 stderr = self._translate_newlines(stderr, 

1909 self.stderr.encoding, 

1910 self.stderr.errors) 

1911 

1912 return (stdout, stderr) 

1913 

1914 

1915 def _save_input(self, input): 

1916 # This method is called from the _communicate_with_*() methods 

1917 # so that if we time out while communicating, we can continue 

1918 # sending input if we retry. 

1919 if self.stdin and self._input is None: 

1920 self._input_offset = 0 

1921 self._input = input 

1922 if input is not None and self.text_mode: 

1923 self._input = self._input.encode(self.stdin.encoding, 

1924 self.stdin.errors) 

1925 

1926 

1927 def send_signal(self, sig): 

1928 """Send a signal to the process.""" 

1929 # Skip signalling a process that we know has already died. 

1930 if self.returncode is None: 

1931 os.kill(self.pid, sig) 

1932 

1933 def terminate(self): 

1934 """Terminate the process with SIGTERM 

1935 """ 

1936 self.send_signal(signal.SIGTERM) 

1937 

1938 def kill(self): 

1939 """Kill the process with SIGKILL 

1940 """ 

1941 self.send_signal(signal.SIGKILL)