有没有一个安静的subprocess.call版本?
是否有一个subprocess.call
的变种,可以运行命令没有打印到标准输出,或者一种方法来阻止它的标准输出消息?
是。 将其stdout
redirect到/dev/null
。
process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))
请注意,往往这种喋喋不休,所以你可能也想沉默。 这是我的例子:
import os from subprocess import check_call with open(os.devnull, 'w') as shutup: return_code = check_call(args, stdout=shutup, stderr=shutup)
subprocess.call
也接受stdin / stdout / stderrredirect:
process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))
这是我使用很多的一个方法:调用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
在这种情况下我使用subprocess.check_output并放弃返回值。 您可能需要添加注释代码,说明您为什么使用check_output替代check_call。 当发生故障时,check_output也会更好,并且您对错误输出感兴趣。 下面的示例代码。 只有当您取消注释打印行时才能看到输出。 如果该命令失败,则抛出exception。
import subprocess ret = subprocess.check_output(["cat", "/tmp/1"]) #print ret