Applied patch 1669481, slightly modified: Support close_fds on Win32

This commit is contained in:
Peter Astrand 2007-05-26 22:18:20 +00:00
parent 5f9b6c9a1b
commit 81a191b351
3 changed files with 16 additions and 6 deletions

View 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.

View 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,

View 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()