是否存在的变体subprocess.call
可以不打印到标准输出运行命令,还是有办法来阻挡它的标准输出消息?
Answer 1:
是。 重定向其stdout
来/dev/null
。
process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))
Answer 2:
通常那种喋喋不休的是标准错误,所以你可能要沉默即得。 这是我的例子:
from subprocess import call, DEVNULL
return_code = call(args, stderr=DEVNULL, stdout=DEVNULL)
注: subprocess.DEVNULL
可因为Python 3.3。 如果你仍然对Python的2:
import os
with open(os.devnull, 'w') as shutup:
return_code = call(args, stdout=shutup, stderr=shutup)
Answer 3:
subprocess.call
也接受标准输入/输出/标准错误重定向:
process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))
Answer 4:
这是一个食谱我用了很多:调用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
Answer 5:
我在这种情况下使用subprocess.check_output,丢弃返回值。 你可能想添加评论你的代码,说明为什么要到位check_call使用check_output。 check_output也更好时出现故障,你感兴趣的错误输出。 下面的实施例的代码。 当您取消对打印输出行仅出现。 如果命令失败,则抛出异常。
import subprocess
ret = subprocess.check_output(["cat", "/tmp/1"])
#print ret
文章来源: Is there a quiet version of subprocess.call?