我有一个名为的二进制文件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的输出,我不希望这样.
有人有建议吗?
DNS*_*DNS 102
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)
Run Code Online (Sandbox Code Playgroud)
如果命令没有任何参数,则可以将其作为简单字符串提供.
如果您的命令依赖于通配符,管道或环境变量等shell功能,则需要将整个命令作为字符串提供,并指定shell = True.但是,应该避免这种情况,因为如果不仔细验证字符串的内容,则表示存在安全隐患.
Man*_*uel 57
如果你有Python 2.4,你可以使用子进程模块:
>>> import subprocess
>>> s = subprocess.Popen(['cowsay', 'hello'], \
stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0]
>>> print s
_______
< hello >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Run Code Online (Sandbox Code Playgroud)
Mec*_*ail 21
在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)
Run Code Online (Sandbox Code Playgroud)
从文档:
subprocess.DEVNULL
可以用作Popen的stdin,stdout或stderr参数的特殊值,表示将使用特殊文件os.devnull.
版本3.3中的新功能.
对于Python 3.0到3.2,您必须使用open(os.devnull)DNS编写的手动打开空设备.
Po'*_*rus 12
如果您的搜索引擎引导您回到这个老问题(像我一样),请注意使用PIPE可能会导致死锁.实际上,因为管道是缓冲的,所以即使没有人读取它,你也可以在管道中写入一定数量的字节.但是缓冲区的大小是有限的.因此,如果您的程序A的输出大于缓冲区,则A将在写入时被阻止,而调用程序B等待A的终止.但是,在这种特殊情况下...请参阅下面的注释.
不过,我建议使用Devin Jeanpierre和DNS的解决方案.