From 739aa36818131fc4917fa2e13a3af1f23344fcb7 Mon Sep 17 00:00:00 2001 From: Philip Jenvey Date: Fri, 22 May 2009 05:35:32 +0000 Subject: [PATCH] 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 | 10 ++++++++++ Lib/test/test_cmd_line.py | 6 ++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 4c4f4aea479..946a504c4f4 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -157,6 +157,12 @@ This module also defines two 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) @@ -171,6 +177,10 @@ This module also defines two shortcut functions: .. versionadded:: 2.5 + .. warning:: + + See the warning for :func:`call`. + .. function:: check_output(*popenargs, **kwargs) diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index efef74f09c9..09945f7e28c 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -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 @@ 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)