]> granicus.if.org Git - python/commitdiff
Merged revisions 72817 via svnmerge from
authorPhilip Jenvey <pjenvey@underboss.org>
Fri, 22 May 2009 05:46:35 +0000 (05:46 +0000)
committerPhilip Jenvey <pjenvey@underboss.org>
Fri, 22 May 2009 05:46:35 +0000 (05:46 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r72817 | philip.jenvey | 2009-05-21 22:35:32 -0700 (Thu, 21 May 2009) | 4 lines

  don't use subprocess.call with PIPEs as the child can fill the pipe buf and
  deadlock. add a warning to subprocess docs about this, similar to Popen.wait's.
  refs http://bugs.jython.org/issue1351
........

Doc/library/subprocess.rst
Lib/test/test_cmd_line.py

index 7952f6837ee2df8cdedfa6411e9ed5b61adc14db..9853e62baf1c7c9cb3afdf3e576bdebb9c7f09a0 100644 (file)
@@ -152,6 +152,12 @@ This module also defines four shortcut functions:
 
       retcode = call(["ls", "-l"])
 
+   .. warning::
+
+      Like :meth:`Popen.wait`, this will deadlock if the child process
+      generates enough output to a stdout or stderr pipe such that it blocks
+      waiting for the OS pipe buffer to accept more data.
+
 
 .. function:: check_call(*popenargs, **kwargs)
 
@@ -164,6 +170,10 @@ This module also defines four shortcut functions:
 
       check_call(["ls", "-l"])
 
+   .. warning::
+
+      See the warning for :func:`call`.
+
 
 .. function:: check_output(*popenargs, **kwargs)
 
index 84588cf5fbf6a6a866ee53662d6e394eb78b87de..72edc2ea73331c744ef6adaec50003727b253af4 100644 (file)
@@ -2,6 +2,7 @@
 # All tests are executed with environment variables ignored
 # See test_cmd_line_script.py for testing of script execution
 
+import os
 import test.support, unittest
 import os
 import sys
@@ -40,8 +41,9 @@ class CmdLineTest(unittest.TestCase):
     def exit_code(self, *args):
         cmd_line = [sys.executable, '-E']
         cmd_line.extend(args)
-        return subprocess.call(cmd_line, stdout=subprocess.PIPE,
-                                         stderr=subprocess.PIPE)
+        with open(os.devnull, 'w') as devnull:
+            return subprocess.call(cmd_line, stdout=devnull,
+                                   stderr=subprocess.STDOUT)
 
     def test_directories(self):
         self.assertNotEqual(self.exit_code('.'), 0)