我有一个名为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
的输出,我不希望这样。
有人有建议吗?
答案 0 :(得分: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)
如果命令没有任何参数,您可以将其作为简单字符串提供。
如果您的命令依赖于通配符,管道或环境变量等shell功能,则需要将整个命令作为字符串提供,并指定shell = True
。但是,应该避免这种情况,因为如果未仔细验证字符串的内容,则表示存在安全隐患。
答案 1 :(得分:57)
如果你有Python 2.4,你可以使用the subprocess module:
>>> import subprocess
>>> s = subprocess.Popen(['cowsay', 'hello'], \
stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0]
>>> print s
_______
< hello >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
答案 2 :(得分:21)
在Python 3.3及更高版本中,subprocess
支持an option for redirecting to /dev/null
。要使用它,在致电.Popen
和朋友时,请将stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
指定为关键字参数。
因此,对于Python 3.3+重写的DNS的答案变为
import subprocess
command = ["executable", "argument_1", "argument_2"]
result = subprocess.call(command,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL)
来自文档:
subprocess.DEVNULL¶
可用作stdin,stdout或stderr的特殊值 对Popen的参数并指出特殊文件os.devnull会 使用。
版本3.3中的新功能。
对于Python 3.0到3.2,您必须使用open(os.devnull)
手动打开空设备,如DNS所写。
答案 3 :(得分:12)
如果你的搜索引擎引导你回到这个老问题(比如我),请注意使用PIPE可能会导致死锁。 实际上,因为管道是缓冲的,所以即使没有人读取它,你也可以在管道中写入一定数量的字节。但是缓冲区的大小是有限的。因此,如果您的程序A的输出大于缓冲区,则A将在写入时被阻止,而调用程序B等待A的终止。但不是,在这种特殊情况下...请参阅下面的注释。 /强>
不过,我建议使用Devin Jeanpierre和DNS的解决方案。
答案 4 :(得分:8)
正如os.system()文档所提到的那样,使用subprocess模块,如果你愿意,可以设置stdout = open(os.devnull,'w')(对于stderr也可能是相同的)你打开子流程。
答案 5 :(得分:1)
我知道游戏已经晚了,但为什么不直接从os.system中将输出重定向到/ dev / null? E.g:
tgt_file = "./bogus.txt"
os.sytem("d2u '%s' &> /dev/null" % tgt_file)
这似乎适用于那些你不想处理subprocess.STDOUT的情况。
答案 6 :(得分:0)
我用:
call(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
其中command是命令+ arguments
的字符串为此,您必须导入子流程
答案 7 :(得分:0)
如果你需要捕获STDOUT,不将它分配给变量吗?例如:
megabyte=''
# Create a 1 MiB string of NULL characters.
for i in range(1048576):
megabyte += '\0'
fh=open('zero.bin','w')
# Write an 8 GiB file.
for i in range(8192):
print(i)
# Suppress output of 'write()' by assigning to a variable.
discard=fh.write(megabyte)
fh.close()
我正在创建一个大的零填充文件,以便在我的硬盘上零空闲空间,并发现每次调用handle.write(string)都会吐出写入的字节数。将其分配给可挽回的输出。
答案 8 :(得分:0)
如果您不想等待命令完成,例如启动备份任务,则另一个选项是将其传递给bash,这样做可以使重定向正常运行。
例如,使用aplay:
启动声音文件import os
def PlaySound(filename):
command = 'bash -c "aplay %s &> /dev/null &"' % (filename)
os.system(command)
这样我可以生成一个新进程,而不是等待它完成并阻止它打印到终端。 唯一的问题是它将加载一个bash实例以及你正在运行的进程,从而提供轻微的开销。