If *close_fds* is true, all file descriptors except :const:`0`, :const:`1` and
:const:`2` will be closed before the child process is executed. (Unix only).
- Or, on Windows, if *close_fds* is true then no handles will be inherited by the
+ The recommended value for this argument is True.
+ On Windows, if *close_fds* is true then no handles will be inherited by the
child process. Note that on Windows, you cannot set *close_fds* to true and
also redirect the standard handles by setting *stdin*, *stdout* or *stderr*.
+.. versionchanged:: 3.2
+ Callers should always specify a *close_fds* to avoid a DeprecationWarning.
+ The default value for this argument will be changing in Python 3.3.
+
If *shell* is :const:`True`, the specified command will be executed through the
shell.
import gc
import signal
import builtins
+import warnings
# Exception classes used by this module.
class CalledProcessError(Exception):
import _posixsubprocess
except ImportError:
_posixsubprocess = None
- import warnings
warnings.warn("The _posixsubprocess module is not being used. "
"Child process reliability may suffer if your "
"program uses threads.", RuntimeWarning)
class Popen(object):
def __init__(self, args, bufsize=0, executable=None,
stdin=None, stdout=None, stderr=None,
- preexec_fn=None, close_fds=False, shell=False,
+ preexec_fn=None, close_fds=None, shell=False,
cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0,
restore_signals=True, start_new_session=False):
if not isinstance(bufsize, int):
raise TypeError("bufsize must be an integer")
+ if close_fds is None:
+ # Notification for http://bugs.python.org/issue7213 & issue2320
+ warnings.warn(
+ 'The close_fds parameter was not specified. Its default'
+ ' will change from False to True in a future Python'
+ ' version. Most users should set it to True. Please'
+ ' update your code explicitly set close_fds.',
+ DeprecationWarning)
+
if mswindows:
if preexec_fn is not None:
raise ValueError("preexec_fn is not supported on Windows "
import time
import re
import sysconfig
+import warnings
try:
import gc
except ImportError:
self.assertEqual(actual, expected, msg)
+class DeprecationWarningTests(BaseTestCase):
+ def setUp(self):
+ BaseTestCase.setUp(self)
+ self._saved_warn = warnings.warn
+ self._warn_calls = []
+ warnings.warn = self._record_warn
+
+ def tearDown(self):
+ warnings.warn = self._saved_warn
+ BaseTestCase.tearDown(self)
+
+ def _record_warn(self, *args):
+ """A warnings.warn function that records calls."""
+ self._warn_calls.append(args)
+ self._saved_warn(*args)
+
+ def testCloseFdsWarning(self):
+ quick_process = [sys.executable, "-c", "import sys; sys.exit(0)"]
+ subprocess.call(quick_process, close_fds=True)
+ self.assertEqual([], self._warn_calls)
+ subprocess.call(quick_process, close_fds=False)
+ self.assertEqual([], self._warn_calls)
+ self.assertWarns(DeprecationWarning, subprocess.call, quick_process)
+ self.assertEqual(1, len(self._warn_calls))
+ self.assertIn('close_fds parameter was not specified',
+ self._warn_calls[0][0])
+
+
class ProcessTestCase(BaseTestCase):
def test_call_seq(self):
ProcessTestCaseNoPoll,
HelperFunctionTests,
CommandsWithSpaces,
- ContextManagerTests)
+ ContextManagerTests,
+ DeprecationWarningTests)
support.run_unittest(*unit_tests)
support.reap_children()