[Python-checkins] r53647 - in python/branches/release25-maint: Lib/subprocess.py Misc/NEWS

peter.astrand python-checkins at python.org
Tue Feb 6 16:41:47 CET 2007


Author: peter.astrand
Date: Tue Feb  6 16:41:46 2007
New Revision: 53647

Modified:
   python/branches/release25-maint/Lib/subprocess.py
   python/branches/release25-maint/Misc/NEWS
Log:
Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Backport from rev 53646.

Modified: python/branches/release25-maint/Lib/subprocess.py
==============================================================================
--- python/branches/release25-maint/Lib/subprocess.py	(original)
+++ python/branches/release25-maint/Lib/subprocess.py	Tue Feb  6 16:41:46 2007
@@ -592,6 +592,22 @@
                             c2pread, c2pwrite,
                             errread, errwrite)
 
+        # 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:
             self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
         if c2pread:
@@ -668,7 +684,9 @@
 
             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()
@@ -682,7 +700,9 @@
 
             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()
@@ -696,7 +716,9 @@
 
             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()

Modified: python/branches/release25-maint/Misc/NEWS
==============================================================================
--- python/branches/release25-maint/Misc/NEWS	(original)
+++ python/branches/release25-maint/Misc/NEWS	Tue Feb  6 16:41:46 2007
@@ -157,6 +157,9 @@
 Library
 -------
 
+- Bug #1124861: Automatically create pipes if GetStdHandle fails in
+  subprocess. 
+
 - Patch #783050: the pty.fork() function now closes the slave fd
   correctly.
 


More information about the Python-checkins mailing list