summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/subprocess.py13
-rw-r--r--Lib/test/test_subprocess.py32
2 files changed, 42 insertions, 3 deletions
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index bdbcc6b..ca67012 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -339,6 +339,7 @@ import traceback
import gc
import signal
import builtins
+import warnings
# Exception classes used by this module.
class CalledProcessError(Exception):
@@ -378,7 +379,6 @@ else:
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)
@@ -605,7 +605,7 @@ def getoutput(cmd):
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):
@@ -618,6 +618,15 @@ class Popen(object):
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 "
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index ec1e186..8759941 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -9,6 +9,7 @@ import tempfile
import time
import re
import sysconfig
+import warnings
try:
import gc
except ImportError:
@@ -57,6 +58,34 @@ class BaseTestCase(unittest.TestCase):
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):
@@ -1233,7 +1262,8 @@ def test_main():
ProcessTestCaseNoPoll,
HelperFunctionTests,
CommandsWithSpaces,
- ContextManagerTests)
+ ContextManagerTests,
+ DeprecationWarningTests)
support.run_unittest(*unit_tests)
support.reap_children()