如何在Python 2.7中隐藏subprocess的输出

我在Ubuntu上使用eSpeak,并有一个Python 2.7脚本,可以打印和发送消息:

import subprocess text = 'Hello World.' print text subprocess.call(['espeak', text]) 

eSpeak可以产生所需的声音,但是会出现一些错误(ALSA lib …,没有套接字连接),所以我不能轻易读取之前打印的内容。 退出码是0。

不幸的是,没有logging的选项来closures它的详细程度,所以我正在寻找一种方法,只有视觉上保持沉默,并保持打开的shell清洁,以进一步的互动。

我该怎么做?

将输出redirect到DEVNULL:

 import os import subprocess FNULL = open(os.devnull, 'w') retcode = subprocess.call(['echo', 'foo'], stdout=FNULL, stderr=subprocess.STDOUT) 

这与运行这个shell命令是一样的:

 retcode = os.system("echo 'foo' &> /dev/null") 

这是一个更便携的版本(只是为了好玩,在你的情况下是不必要的):

 #!/usr/bin/env python # -*- coding: utf-8 -*- from subprocess import Popen, PIPE, STDOUT try: from subprocess import DEVNULL # py3k except ImportError: import os DEVNULL = open(os.devnull, 'wb') text = u"René Descartes" p = Popen(['espeak', '-b', '1'], stdin=PIPE, stdout=DEVNULL, stderr=STDOUT) p.communicate(text.encode('utf-8')) assert p.returncode == 0 # use appropriate for your program error handling here 

使用subprocess.check_output (python 2.7中的新增function)。 如果命令失败,它将压制stdout并引发exception。 (它实际上会返回标准输出的内容,所以你可以稍后在你的程序中使用它。)例子:

 import subprocess try: subprocess.check_output(['espeak', text]) except subprocess.CalledProcessError: # Do something 

您也可以使用以下命令来抑制stderr:

  subprocess.check_output(["espeak", text], stderr=subprocess.STDOUT) 

对于早于2.7,请使用

 import os import subprocess with open(os.devnull, 'w') as FNULL: try: subprocess._check_call(['espeak', text], stdout=FNULL) except subprocess.CalledProcessError: # Do something 

在这里,你可以使用抑制stderr

  subprocess._check_call(['espeak', text], stdout=FNULL, stderr=FNULL) 

如果你碰巧在窗口中使用subprocess模块(不是特定于这个问题,但匹配标题)与Python 2.7x,它只是你想压制的错误(特定于这个问题),你可以做这样的事情:

output = subprocess.check_output(["arp", "-a", "-N", "127.0.0.2"], stderr=subprocess.STDOUT)

你应该可以在你的系统上面使用上面的代码进行testing,但是如果你的arp表中存在127.0.0.2,你可以select一个没有关联的ip。

为什么不使用commands.getoutput()呢?

 import commands text = "Mario Balotelli" output = 'espeak "%s"' % text print text a = commands.getoutput(output) 
Interesting Posts