Вопрос-Ответ

How to hide output of subprocess

Как скрыть выходные данные подпроцесса

Я использую eSpeak в Ubuntu, и у меня есть скрипт на Python 2.7, который печатает и передает сообщение:

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

eSpeak выдает нужные звуки, но загромождает оболочку некоторыми ошибками (ALSA lib ..., нет подключения к сокету), поэтому я не могу легко прочитать то, что было напечатано ранее. Код выхода равен 0.

К сожалению, нет документированной опции отключить его детализацию, поэтому я ищу способ только визуально отключить его и сохранить открытую оболочку чистой для дальнейшего взаимодействия.

Как я могу это сделать?

Переведено автоматически
Ответ 1

Для python >= 3.3 перенаправьте выходные данные в DEVNULL:

import os
import subprocess

retcode = subprocess.call(['echo', 'foo'],
stdout=subprocess.DEVNULL,
stderr=subprocess.STDOUT)

Для python <3.3, включая 2.7 используйте:

FNULL = open(os.devnull, 'w')
retcode = subprocess.call(['echo', 'foo'],
stdout=FNULL,
stderr=subprocess.STDOUT)

Фактически это то же самое, что и выполнение этой команды оболочки:

retcode = os.system("echo 'foo' &> /dev/null")
Ответ 2

Вот более переносимая версия (просто для удовольствия, в вашем случае в ней нет необходимости):

#!/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
Ответ 3

Используйте subprocess.check_output (новое в python 2.7). Это подавит стандартный вывод и вызовет исключение, если команда завершится неудачно. (На самом деле он возвращает содержимое стандартного вывода, так что вы можете использовать его позже в своей программе, если хотите.) Пример:

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)
Ответ 4

Начиная с Python3, вам больше не нужно открывать devnull и вы можете вызвать подпроцесс.DEVNULL.

Ваш код будет обновлен таким образом:

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