如何在Python 2.7中隐藏子进程的输出

时间:2012-06-29 22:08:58

标签: python python-2.7 subprocess espeak

我在Ubuntu上使用eSpeak并且有一个Python 2.7脚本可以打印并说出一条消息:

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

eSpeak会产生所需的声音,但会使shell出现一些错误(ALSA lib ...,没有套接字连接),因此我无法轻易阅读之前打印的内容。退出代码为0.

不幸的是,没有任何记录选项可以关闭它的详细程度,所以我正在寻找一种只能在视觉上使其静音并保持打开的外壳清洁以便进一步交互的方法。

我该怎么做?

6 个答案:

答案 0 :(得分:373)

将输出重定向到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")

答案 1 :(得分:80)

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

#!/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

答案 2 :(得分:26)

使用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)

答案 3 :(得分:10)

从Python3开始,您不再需要打开devnull并可以调用subprocess.DEVNULL

您的代码将这样更新:

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

答案 4 :(得分:0)

如果您正在使用Windows中的子进程模块(不是特定于此问题但匹配标题)与python 2.7x并且它只是您想要抑制的错误(特定于此问题),您可以执行类似的操作这样:

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

你应该能够在你的系统上使用上面的代码进行测试,但是如果你的arp表中恰好存在127.0.0.2,你可以选择一个没有与之关联的ip的ip。

答案 5 :(得分:-6)

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

import commands

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