ryp*_*pel 262 python subprocess espeak python-2.7
我在Ubuntu上使用eSpeak并且有一个Python 2.7脚本可以打印并说出一条消息:
import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])
Run Code Online (Sandbox Code Playgroud)
eSpeak会产生所需的声音,但是外壳会出现一些错误(ALSA lib ...,没有套接字连接),因此我无法轻易读取之前打印的内容.退出代码为0.
不幸的是,没有任何记录的选项可以关闭它的详细程度,所以我正在寻找一种只能在视觉上使其静音并保持打开的外壳清洁以进行进一步交互的方法.
我怎样才能做到这一点?
jdi*_*jdi 398
将输出重定向到DEVNULL:
import os
import subprocess
FNULL = open(os.devnull, 'w')
retcode = subprocess.call(['echo', 'foo'], stdout=FNULL, stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)
它实际上与运行此shell命令相同:
retcode = os.system("echo 'foo' &> /dev/null")
Run Code Online (Sandbox Code Playgroud)
jfs*_*jfs 85
这是一个更便携的版本(只是为了好玩,在你的情况下没有必要):
#!/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
Run Code Online (Sandbox Code Playgroud)
Zag*_*ags 28
使用subprocess.check_output
(python 2.7中的新增功能).如果命令失败,它将禁止stdout并引发异常.(它实际上返回了stdout的内容,因此如果需要,可以稍后在程序中使用它.)示例:
import subprocess
try:
subprocess.check_output(['espeak', text])
except subprocess.CalledProcessError:
# Do something
Run Code Online (Sandbox Code Playgroud)
您还可以使用以下内容来抑制stderr:
subprocess.check_output(["espeak", text], stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)
对于早于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
Run Code Online (Sandbox Code Playgroud)
在这里,您可以使用抑制stderr
subprocess._check_call(['espeak', text], stdout=FNULL, stderr=FNULL)
Run Code Online (Sandbox Code Playgroud)
Jos*_*eia 11
由于Python3的你不再需要打开devnull并且可以调用subprocess.DEVNULL.
您的代码将更新为:
import subprocess
text = 'Hello World.'
print(text)
subprocess.call(['espeak', text], stderr=subprocess.DEVNULL)
Run Code Online (Sandbox Code Playgroud)