抑制Python调用可执行文件的输出

时间:2009-03-30 22:39:15

标签: python redirect

我有一个名为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的输出,我不希望这样。

有人有建议吗?

9 个答案:

答案 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实例以及你正在运行的进程,从而提供轻微的开销。