mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
In subprocess, wrap pipe fds before launching the child. Hopefully this
will fix intermittent failures on some buildbots (issue #8458).
This commit is contained in:
parent
9bd4a245f2
commit
c99823211b
1 changed files with 21 additions and 7 deletions
|
@ -699,13 +699,9 @@ class Popen(object):
|
||||||
c2pread, c2pwrite,
|
c2pread, c2pwrite,
|
||||||
errread, errwrite) = self._get_handles(stdin, stdout, stderr)
|
errread, errwrite) = self._get_handles(stdin, stdout, stderr)
|
||||||
|
|
||||||
self._execute_child(args, executable, preexec_fn, close_fds,
|
# We wrap OS handles *before* launching the child, otherwise a
|
||||||
pass_fds, cwd, env, universal_newlines,
|
# quickly terminating child could make our fds unwrappable
|
||||||
startupinfo, creationflags, shell,
|
# (see #8458).
|
||||||
p2cread, p2cwrite,
|
|
||||||
c2pread, c2pwrite,
|
|
||||||
errread, errwrite,
|
|
||||||
restore_signals, start_new_session)
|
|
||||||
|
|
||||||
if mswindows:
|
if mswindows:
|
||||||
if p2cwrite != -1:
|
if p2cwrite != -1:
|
||||||
|
@ -730,6 +726,24 @@ class Popen(object):
|
||||||
if universal_newlines:
|
if universal_newlines:
|
||||||
self.stderr = io.TextIOWrapper(self.stderr)
|
self.stderr = io.TextIOWrapper(self.stderr)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self._execute_child(args, executable, preexec_fn, close_fds,
|
||||||
|
pass_fds, cwd, env, universal_newlines,
|
||||||
|
startupinfo, creationflags, shell,
|
||||||
|
p2cread, p2cwrite,
|
||||||
|
c2pread, c2pwrite,
|
||||||
|
errread, errwrite,
|
||||||
|
restore_signals, start_new_session)
|
||||||
|
except:
|
||||||
|
# Cleanup if the child failed starting
|
||||||
|
for f in filter(None, [self.stdin, self.stdout, self.stderr]):
|
||||||
|
try:
|
||||||
|
f.close()
|
||||||
|
except EnvironmentError:
|
||||||
|
# Ignore EBADF or other errors
|
||||||
|
pass
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
def _translate_newlines(self, data, encoding):
|
def _translate_newlines(self, data, encoding):
|
||||||
data = data.replace(b"\r\n", b"\n").replace(b"\r", b"\n")
|
data = data.replace(b"\r\n", b"\n").replace(b"\r", b"\n")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue