如何在Python2.7中隐藏子流程的输出

2024-04-19 14:35:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

eSpeak会产生所需的声音,但会使shell混乱,并出现一些错误(ALSA lib…,没有socket connect),因此我无法轻松阅读之前打印的内容。退出代码为0。

不幸的是,没有文档化的选项来关闭它的详细性,所以我正在寻找一种方法,只在视觉上使它安静下来,并保持打开的shell干净,以便进行进一步的交互。

我该怎么做?


Tags: textimport脚本声音消息helloworldubuntu
3条回答

使用^{}(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

在这里,你可以用

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

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

相关问题 更多 >