Applied patch 1669481, slightly modified: Support close_fds on Win32
This commit is contained in:
parent
5f9b6c9a1b
commit
81a191b351
|
@ -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.
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue