summaryrefslogtreecommitdiffstats
path: root/Lib/subprocess.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/subprocess.py')
-rw-r--r--Lib/subprocess.py58
1 files changed, 40 insertions, 18 deletions
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index 759b59f1..e9c9a0e 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -593,14 +593,30 @@ class Popen(object):
c2pread, c2pwrite,
errread, errwrite)
- if p2cwrite:
+ # On Windows, you cannot just redirect one or two handles: You
+ # either have to redirect all three or none. If the subprocess
+ # user has only redirected one or two handles, we are
+ # automatically creating PIPEs for the rest. We should close
+ # these after the process is started. See bug #1124861.
+ if mswindows:
+ if stdin is None and p2cwrite is not None:
+ os.close(p2cwrite)
+ p2cwrite = None
+ if stdout is None and c2pread is not None:
+ os.close(c2pread)
+ c2pread = None
+ if stderr is None and errread is not None:
+ os.close(errread)
+ errread = None
+
+ if p2cwrite is not None:
self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
- if c2pread:
+ if c2pread is not None:
if universal_newlines:
self.stdout = os.fdopen(c2pread, 'rU', bufsize)
else:
self.stdout = os.fdopen(c2pread, 'rb', bufsize)
- if errread:
+ if errread is not None:
if universal_newlines:
self.stderr = os.fdopen(errread, 'rU', bufsize)
else:
@@ -669,7 +685,9 @@ class Popen(object):
if stdin is None:
p2cread = GetStdHandle(STD_INPUT_HANDLE)
- elif stdin == PIPE:
+ if p2cread is not None:
+ pass
+ elif stdin is None or stdin == PIPE:
p2cread, p2cwrite = CreatePipe(None, 0)
# Detach and turn into fd
p2cwrite = p2cwrite.Detach()
@@ -683,7 +701,9 @@ class Popen(object):
if stdout is None:
c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
- elif stdout == PIPE:
+ if c2pwrite is not None:
+ pass
+ elif stdout is None or stdout == PIPE:
c2pread, c2pwrite = CreatePipe(None, 0)
# Detach and turn into fd
c2pread = c2pread.Detach()
@@ -697,7 +717,9 @@ class Popen(object):
if stderr is None:
errwrite = GetStdHandle(STD_ERROR_HANDLE)
- elif stderr == PIPE:
+ if errwrite is not None:
+ pass
+ elif stderr is None or stderr == PIPE:
errread, errwrite = CreatePipe(None, 0)
# Detach and turn into fd
errread = errread.Detach()
@@ -987,29 +1009,29 @@ class Popen(object):
# Child
try:
# Close parent's pipe ends
- if p2cwrite:
+ if p2cwrite is not None:
os.close(p2cwrite)
- if c2pread:
+ if c2pread is not None:
os.close(c2pread)
- if errread:
+ if errread is not None:
os.close(errread)
os.close(errpipe_read)
# Dup fds for child
- if p2cread:
+ if p2cread is not None:
os.dup2(p2cread, 0)
- if c2pwrite:
+ if c2pwrite is not None:
os.dup2(c2pwrite, 1)
- if errwrite:
+ if errwrite is not None:
os.dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the same
# fd more than once, or standard fds.
- if p2cread and p2cread not in (0,):
+ if p2cread is not None and p2cread not in (0,):
os.close(p2cread)
- if c2pwrite and c2pwrite not in (p2cread, 1):
+ if c2pwrite is not None and c2pwrite not in (p2cread, 1):
os.close(c2pwrite)
- if errwrite and errwrite not in (p2cread, c2pwrite, 2):
+ if errwrite is not None and errwrite not in (p2cread, c2pwrite, 2):
os.close(errwrite)
# Close all other fds, if asked for
@@ -1042,11 +1064,11 @@ class Popen(object):
# Parent
os.close(errpipe_write)
- if p2cread and p2cwrite:
+ if p2cread is not None and p2cwrite is not None:
os.close(p2cread)
- if c2pwrite and c2pread:
+ if c2pwrite is not None and c2pread is not None:
os.close(c2pwrite)
- if errwrite and errread:
+ if errwrite is not None and errread is not None:
os.close(errwrite)
# Wait for exec to fail or succeed; possibly raising exception