在Python调用中禁止输出到可执行文件

我有一个名为A的二进制文件,在调用时会生成输出。 如果我从Bash shell调用它,大部分输出被A > /dev/null所抑制。 所有的输出都被A &> /dev/null所抑制

我有一个名为B ,需要调用A的Python脚本。 我希望能够从B生成输出,同时抑制A所有输出。

B ,我尝试了os.system('A')os.system('A > /dev/null')os.system('A &> /dev/null')os.execvp('...')等,但是没有一个压制A的所有输出。

我可以运行B &> /dev/null ,但是这也抑制了所有B的输出,我不想这样做。

任何人有build议?

如果你有Python 2.4,你可以使用subprocess模块 :

 >>> import subprocess >>> s = subprocess.Popen(['cowsay', 'hello'], \ stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0] >>> print s _______ < hello > ------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || 
 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) 

如果该命令没有任何参数,则可以将其作为简单的string提供。

如果您的命令依赖通配符,pipe道或环境variables等shell特性,则需要将整个命令作为string提供,并指定shell = True 。 尽pipe如此,应该避免这种情况,因为如果string的内容没有经过认真的validation,它会带来安全隐患。

在Python 3.3及更高版本中, subprocess支持redirect到/dev/null的选项 。 要使用它,在调用.Popen和friends时,指定stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, .Popen stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, .Popen作为关键字参数。

所以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版本中的新function

对于Python 3.0到3.2,您必须使用open(os.devnull)手动打开空设备,如DNS所写。

如果你的search引擎引导你这个老问题(像我一样),请注意使用PIPE可能导致死锁 。 事实上,由于pipe道是缓冲的,所以即使没有人读取pipe道,也可以在pipe道中写入一定数量的字节。 但是缓冲区的大小是有限的。 因此,如果你的程序A的输出大于缓冲区,A将在写入时被阻塞,而调用程序B等待A的终止。 但是,在这种特殊情况下,请参阅下面的注释。

不过,我推荐使用Devin Jeanpierre和DNS解决scheme。

正如os.system()文档中提到的那样,使用subprocess模块,并且,如果你喜欢的话,当你打开subprocess的时候,设置stdout = open(os.devnull,'w')(也许和stderr相同)。

我知道游戏迟到了,但是为什么不把输出redirect到os.system中的/ dev / null呢? 例如:

 tgt_file = "./bogus.txt" os.sytem("d2u '%s' &> /dev/null" % tgt_file) 

这似乎适用于那些你不想处理subprocess的时候.STDOUT。

如果你只需要捕获STDOUT,不要把它分配给一个variables做到这一点? 例如:

 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() 

我正在创build一个大的零填充文件,以零硬盘上的可用空间,并发现每个调用handle.write(string)吐出写入的字节数。 把它分配给一个可行的压制输出。

如果你不想等待命令完成,比如启动一个备份任务,另一个选项是通过bash传递,这样做可以使redirect正常运行。

例如,使用aplay启动一个声音文件:

 import os def PlaySound(filename): command = 'bash -c "aplay %s &> /dev/null &"' % (filename) os.system(command) 

这样我可以产生一个新的进程,而不是等待它完成,并停止打印到terminal。 唯一的问题是,它会加载一个bash实例,以及你正在运行的进程,提供一个小的开销。

我用:

 call(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 

其中command是命令+参数的string

为此,您必须导入子stream程