diff options
author | Peter Astrand <astrand@lysator.liu.se> | 2007-05-26 22:18:20 (GMT) |
---|---|---|
committer | Peter Astrand <astrand@lysator.liu.se> | 2007-05-26 22:18:20 (GMT) |
commit | 81a191b3510bbed302cb0a766bc6966cb4effaca (patch) | |
tree | e5c4438e52d5fe183db39d45ebddc34c56742f8b | |
parent | 5f9b6c9a1bc1c6aa1b07db52c8b851bb7e798f7a (diff) | |
download | cpython-81a191b3510bbed302cb0a766bc6966cb4effaca.zip cpython-81a191b3510bbed302cb0a766bc6966cb4effaca.tar.gz cpython-81a191b3510bbed302cb0a766bc6966cb4effaca.tar.bz2 |
Applied patch 1669481, slightly modified: Support close_fds on Win32
-rw-r--r-- | Doc/lib/libsubprocess.tex | 5 | ||||
-rw-r--r-- | Lib/subprocess.py | 9 | ||||
-rw-r--r-- | Lib/test/test_subprocess.py | 8 |
3 files changed, 16 insertions, 6 deletions
diff --git a/Doc/lib/libsubprocess.tex b/Doc/lib/libsubprocess.tex index 408ffa2..24b75a3 100644 --- a/Doc/lib/libsubprocess.tex +++ b/Doc/lib/libsubprocess.tex @@ -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. diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 745c483..ca9489e 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -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, diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index c2db6fa..e79159c 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -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() |