| Index: subprocess2.py
|
| diff --git a/subprocess2.py b/subprocess2.py
|
| index c6ff24f6b2505483a449e9dbbb65515a68db1f3f..c9057ac6ae19dd32c996b6c333bd5cc071a21d84 100644
|
| --- a/subprocess2.py
|
| +++ b/subprocess2.py
|
| @@ -19,6 +19,9 @@ import threading
|
| # Constants forwarded from subprocess.
|
| PIPE = subprocess.PIPE
|
| STDOUT = subprocess.STDOUT
|
| +# Sends stdout or stderr to os.devnull.
|
| +VOID = '/dev/null'
|
| +
|
|
|
| # Globals.
|
| # Set to True if you somehow need to disable this hack.
|
| @@ -123,13 +126,15 @@ def get_english_env(env):
|
| def Popen(args, **kwargs):
|
| """Wraps subprocess.Popen().
|
|
|
| - Forces English output since it's easier to parse the stdout if it is always in
|
| - English.
|
| + Returns a subprocess.Popen object.
|
|
|
| - Sets shell=True on windows by default. You can override this by forcing shell
|
| - parameter to a value.
|
| + - Forces English output since it's easier to parse the stdout if it is always
|
| + in English.
|
| + - Sets shell=True on windows by default. You can override this by forcing
|
| + shell parameter to a value.
|
| + - Adds support for VOID to not buffer when not needed.
|
|
|
| - Popen() can throw OSError when cwd or args[0] doesn't exist.
|
| + Note: Popen() can throw OSError when cwd or args[0] doesn't exist.
|
| """
|
| # Make sure we hack subprocess if necessary.
|
| hack_subprocess()
|
| @@ -149,17 +154,22 @@ def Popen(args, **kwargs):
|
| if kwargs.get('cwd', None):
|
| tmp_str += '; cwd=%s' % kwargs['cwd']
|
| logging.debug(tmp_str)
|
| +
|
| + # Replaces VOID with handle to /dev/null.
|
| + if kwargs.get('stdout') in (VOID, os.devnull):
|
| + kwargs['stdout'] = open(os.devnull, 'w')
|
| + if kwargs.get('stderr') in (VOID, os.devnull):
|
| + kwargs['stderr'] = open(os.devnull, 'w')
|
| return subprocess.Popen(args, **kwargs)
|
|
|
|
|
| def call(args, timeout=None, **kwargs):
|
| """Wraps subprocess.Popen().communicate().
|
|
|
| - The process will be kill with error code -9 after |timeout| seconds if set.
|
| -
|
| - Automatically passes stdin content as input so do not specify stdin=PIPE.
|
| + Returns ((stdout, stderr), returncode).
|
|
|
| - Returns both communicate() tuple and return code wrapped in a tuple.
|
| + - The process will be kill with error code -9 after |timeout| seconds if set.
|
| + - Automatically passes stdin content as input so do not specify stdin=PIPE.
|
| """
|
| stdin = kwargs.pop('stdin', None)
|
| if stdin is not None:
|
| @@ -204,13 +214,9 @@ def call(args, timeout=None, **kwargs):
|
|
|
|
|
| def check_call(args, **kwargs):
|
| - """Similar to subprocess.check_call() but use call() instead.
|
| + """Improved version of subprocess.check_call().
|
|
|
| - This permits to include more details in CalledProcessError().
|
| -
|
| - Runs a command and throws an exception if the command failed.
|
| -
|
| - Returns communicate() tuple.
|
| + Returns (stdout, stderr), unlike subprocess.check_call().
|
| """
|
| out, returncode = call(args, **kwargs)
|
| if returncode:
|
| @@ -222,9 +228,10 @@ def check_call(args, **kwargs):
|
| def capture(args, **kwargs):
|
| """Captures stdout of a process call and returns it.
|
|
|
| - Similar to check_output() excepts that it discards return code.
|
| + Returns stdout.
|
|
|
| - Discards communicate()[1]. By default sets stderr=STDOUT.
|
| + - Discards returncode.
|
| + - Discards stderr. By default sets stderr=STDOUT.
|
| """
|
| if kwargs.get('stderr') is None:
|
| kwargs['stderr'] = STDOUT
|
| @@ -234,11 +241,11 @@ def capture(args, **kwargs):
|
| def check_output(args, **kwargs):
|
| """Captures stdout of a process call and returns it.
|
|
|
| - Discards communicate()[1]. By default sets stderr=STDOUT.
|
| -
|
| - Throws if return code is not 0.
|
| + Returns stdout.
|
|
|
| - Works even prior to python 2.7.
|
| + - Discards stderr. By default sets stderr=STDOUT.
|
| + - Throws if return code is not 0.
|
| + - Works even prior to python 2.7.
|
| """
|
| if kwargs.get('stderr') is None:
|
| kwargs['stderr'] = STDOUT
|
|
|