在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程