]> granicus.if.org Git - python/commitdiff
Applied patch 1669481, slightly modified: Support close_fds on Win32
authorPeter Astrand <astrand@lysator.liu.se>
Sat, 26 May 2007 22:18:20 +0000 (22:18 +0000)
committerPeter Astrand <astrand@lysator.liu.se>
Sat, 26 May 2007 22:18:20 +0000 (22:18 +0000)
Doc/lib/libsubprocess.tex
Lib/subprocess.py
Lib/test/test_subprocess.py

index 408ffa22225806ca55152b4ac9a227cfcd6e0088..24b75a3d3567edf5939de1b87b899c51c6aa1958 100644 (file)
@@ -89,7 +89,10 @@ called in the child process just before the child is executed.
 
 If \var{close_fds} is true, all file descriptors except \constant{0},
 \constant{1} and \constant{2} will be closed before the child process is
-executed. (\UNIX{} only)
+executed. (\UNIX{} only).  Or, on Windows, if \var{close_fds} is true
+then no handles will be inherited by the child process.  Note that on
+Windows, you cannot set \var{close_fds} to true and also redirect the
+standard handles by setting \var{stdin}, \var{stdout} or \var{stderr}.
 
 If \var{shell} is \constant{True}, the specified command will be
 executed through the shell.
index 745c48306bd582dd8fce6e93b0528a95afa2fcf7..ca9489e67d90ef65a7837f0bb9a5a73f281f4e3e 100644 (file)
@@ -545,9 +545,10 @@ class Popen(object):
             if preexec_fn is not None:
                 raise ValueError("preexec_fn is not supported on Windows "
                                  "platforms")
-            if close_fds:
+            if close_fds and (stdin is not None or stdout is not None or
+                              stderr is not None):
                 raise ValueError("close_fds is not supported on Windows "
-                                 "platforms")
+                                 "platforms if you redirect stdin/stdout/stderr")
         else:
             # POSIX
             if startupinfo is not None:
@@ -804,9 +805,7 @@ class Popen(object):
                 hp, ht, pid, tid = CreateProcess(executable, args,
                                          # no special security
                                          None, None,
-                                         # must inherit handles to pass std
-                                         # handles
-                                         1,
+                                         int(not close_fds),
                                          creationflags,
                                          env,
                                          cwd,
index c2db6fab20b7d4bb56b544ef83f147ff16820f1c..e79159c0b179cb4f156e7b34f8372ffc4d425383 100644 (file)
@@ -617,8 +617,16 @@ class ProcessTestCase(unittest.TestCase):
             self.assertRaises(ValueError, subprocess.call,
                               [sys.executable,
                                "-c", "import sys; sys.exit(47)"],
+                              stdout=subprocess.PIPE,
                               close_fds=True)
 
+        def test_close_fds(self):
+            # close file descriptors
+            rc = subprocess.call([sys.executable, "-c",
+                                  "import sys; sys.exit(47)"],
+                                  close_fds=True)
+            self.assertEqual(rc, 47)
+
         def test_shell_sequence(self):
             # Run command through the shell (sequence)
             newenv = os.environ.copy()