我有一个名为的二进制文件A
,在调用时生成输出.如果我从Bash shell调用它,大多数输出都被抑制A > /dev/null
.所有输出都被抑制A &> /dev/null
我有一个名为B
需要调用的python脚本A
.我希望能够从中生成输出B
,同时抑制所有输出A
.
从内B
,我已经试过os.system('A')
,os.system('A > /dev/null')
和os.system('A &> /dev/null')
,os.execvp('...')
等,但这些都不抑制所有来自A的输出
我可以跑B &> /dev/null
,但这也抑制了所有B
的输出,我不希望这样.
有人有建议吗?
import os import subprocess command = ["executable", "argument_1", "argument_2"] with open(os.devnull, "w") as fnull: result = subprocess.call(command, stdout = fnull, stderr = fnull)
如果命令没有任何参数,则可以将其作为简单字符串提供.
如果您的命令依赖于通配符,管道或环境变量等shell功能,则需要将整个命令作为字符串提供,并指定shell = True
.但是,应该避免这种情况,因为如果不仔细验证字符串的内容,则表示存在安全隐患.
如果你有Python 2.4,你可以使用子进程模块:
>>> import subprocess >>> s = subprocess.Popen(['cowsay', 'hello'], \ stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0] >>> print s _______ < hello > ------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
在Python 3.3及更高版本中,subprocess
支持重定向到的选项/dev/null
.要使用它,在呼叫.Popen
和朋友时,请指定stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
为关键字参数.
所以DNS的答案,为Python 3.3+重写,变成了
import subprocess command = ["executable", "argument_1", "argument_2"] result = subprocess.call(command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
从文档:
subprocess.DEVNULL
可以用作Popen的stdin,stdout或stderr参数的特殊值,表示将使用特殊文件os.devnull.
版本3.3中的新功能.
对于Python 3.0到3.2,您必须使用open(os.devnull)
DNS编写的手动打开空设备.
如果您的搜索引擎引导您回到这个老问题(像我一样),请注意使用PIPE可能会导致死锁.实际上,因为管道是缓冲的,所以即使没有人读取它,你也可以在管道中写入一定数量的字节.但是缓冲区的大小是有限的.因此,如果您的程序A的输出大于缓冲区,则A将在写入时被阻止,而调用程序B等待A的终止.但是,在这种特殊情况下...请参阅下面的注释.
不过,我建议使用Devin Jeanpierre和DNS的解决方案.
正如os.system()文档所提到的,使用子进程模块,如果你愿意,在打开子进程时设置stdout = open(os.devnull,'w')(对于stderr也可能是相同的).