如何在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)