summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Astrand <astrand@lysator.liu.se>2007-05-26 22:18:20 (GMT)
committerPeter Astrand <astrand@lysator.liu.se>2007-05-26 22:18:20 (GMT)
commit81a191b3510bbed302cb0a766bc6966cb4effaca (patch)
treee5c4438e52d5fe183db39d45ebddc34c56742f8b
parent5f9b6c9a1bc1c6aa1b07db52c8b851bb7e798f7a (diff)
downloadcpython-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.tex5
-rw-r--r--Lib/subprocess.py9
-rw-r--r--Lib/test/test_subprocess.py8
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()