72

是否有一种变体subprocess.call可以在不打印到标准输出的情况下运行命令,或者有一种方法可以阻止它的标准输出消息?

4

4 回答 4

80

是的。将其重定向stdout/dev/null.

process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))
于 2011-12-16T03:27:11.623 回答
47

通常这种喋喋不休会出现在 stderr 上,所以你可能也想把它静音。从 Python 3.3 开始,subprocess.call直接有了这个特性:

要抑制 stdout 或 stderr,请提供DEVNULL值。

用法:

import subprocess
rc = subprocess.call(args, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)

如果您仍在使用 Python 2:

import os, subprocess

with open(os.devnull, 'wb') as shutup:
    rc = subprocess.call(args, stdout=shutup, stderr=shutup)
于 2011-12-16T03:57:26.220 回答
-1

这是我经常使用的一个方法:调用subprocess并收集输出,当命令成功时丢弃输出,但当它失败时打印输出。

import subprocess as sp
import sys

if "print" in __builtins__.__dict__:
    prn = __builtins__.__dict__["print"]
else:
    def prn(*args, **kwargs):
        """
        prn(value, ..., sep=' ', end='\\n', file=sys.stdout)
        Works just like the print function in Python 3.x but can be used in 2.x.

        Prints the values to a stream, or to sys.stdout by default.
        Optional keyword arguments:
        file: a file-like object (stream); defaults to the current sys.stdout.
        sep:  string inserted between values, default a space.
        end:  string appended after the last value, default a newline.
        """
        sep = kwargs.get("sep", ' ')
        end = kwargs.get("end", '\n')
        file = kwargs.get("file", sys.stdout)

        s = sep.join(str(x) for x in args) + end
        file.write(s)


def rc_run_cmd_basic(lst_cmd, verbose=False, silent=False):
    if silent and verbose:
        raise ValueError("cannot specify both verbose and silent as true")

    p = sp.Popen(lst_cmd, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
    tup_output = p.communicate()

    s_cmd = ' '.join(lst_cmd)
    if verbose:
        prn()
        prn("command: '%s'\n" % s_cmd)

        if 0 != p.returncode:
            prn()
            prn("Command failed with code %d:" % p.returncode)
        else:
            prn("Command succeeded!  code %d" % p.returncode)
    if verbose:
        prn("Output for: " + s_cmd)
        prn(tup_output[0])
        prn()
    if not silent and 0 != p.returncode:
        prn("Error output for: " + s_cmd)
        prn(tup_output[1])
        prn()

    return p.returncode
于 2013-05-08T02:05:40.070 回答
-1

在这种情况下,我使用 subprocess.check_output 并删除返回值。您可能需要在代码中添加注释,说明您使用 check_output 代替 check_call 的原因。当发生故障并且您对错误输出感兴趣时, check_output 也更好。下面的示例代码。仅当您取消注释打印行时才能看到输出。如果命令失败,则会引发异常。

import subprocess
ret = subprocess.check_output(["cat", "/tmp/1"])
#print ret
于 2015-03-29T15:14:13.013 回答