我在Ubuntu上使用eSpeak并且有一个Python 2.7脚本可以打印并说出一条消息:
import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])
eSpeak会产生所需的声音,但是外壳会出现一些错误(ALSA lib ...,没有套接字连接),因此我无法轻易读取之前打印的内容。退出代码为0。
不幸的是,没有任何记录的选项可以关闭它的详细程度,所以我正在寻找一种只能在视觉上使其静音并保持打开的外壳清洁以进行进一步交互的方法。
我怎样才能做到这一点?
将输出重定向到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中的新增功能)。如果命令失败,它将禁止stdout并引发异常。 (它实际上返回了stdout的内容,因此如果需要,可以稍后在程序中使用它。)示例:
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)
如果您碰巧在Windows中使用了子进程模块(不是特定于这个问题但是匹配标题)和python 2.7x并且它只是您想要抑制的错误(特定于此问题),您可以执行以下操作:
import subprocess
text = 'Hello World.'
print(text)
subprocess.call(['espeak', text], stderr=subprocess.DEVNULL)
您应该能够使用上面的代码在您的系统上进行测试,但如果您的arp表中恰好存在127.0.0.2,您可以选择一个没有与之关联的IP的IP。
为什么不使用commands.getoutput()呢?
output = subprocess.check_output(["arp", "-a", "-N", "127.0.0.2"], stderr=subprocess.STDOUT)