[Python-checkins] r72817 - in python/trunk: Doc/library/subprocess.rst Lib/test/test_cmd_line.py

philip.jenvey python-checkins at python.org
Fri May 22 07:35:33 CEST 2009


Author: philip.jenvey
Date: Fri May 22 07:35:32 2009
New Revision: 72817

Log:
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


Modified:
   python/trunk/Doc/library/subprocess.rst
   python/trunk/Lib/test/test_cmd_line.py

Modified: python/trunk/Doc/library/subprocess.rst
==============================================================================
--- python/trunk/Doc/library/subprocess.rst	(original)
+++ python/trunk/Doc/library/subprocess.rst	Fri May 22 07:35:32 2009
@@ -157,6 +157,12 @@
 
       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)
 
@@ -171,6 +177,10 @@
 
    .. versionadded:: 2.5
 
+   .. warning::
+
+      See the warning for :func:`call`.
+
 
 .. function:: check_output(*popenargs, **kwargs)
 

Modified: python/trunk/Lib/test/test_cmd_line.py
==============================================================================
--- python/trunk/Lib/test/test_cmd_line.py	(original)
+++ python/trunk/Lib/test/test_cmd_line.py	Fri May 22 07:35:32 2009
@@ -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.test_support, unittest
 import sys
 import subprocess
@@ -29,8 +30,9 @@
     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)


More information about the Python-checkins mailing list