Как скрыть вывод подпроцесса в Python 2.7
я использую eSpeak на Ubuntu и имею скрипт Python 2.7, который печатает и говорит сообщение:
import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])
eSpeak производит нужные звуки, но загромождает оболочку с некоторыми ошибками (ALSA lib..., нет подключения сокета), поэтому я не могу легко прочитать то, что было напечатано ранее. Код выхода 0.
к сожалению, нет документированной возможности отключить его многословие, поэтому я ищу способ только визуально заставить его замолчать и сохранить открытую оболочку чистой для дальнейшего взаимодействие.
Как я могу это сделать?
6 ответов:
перенаправить вывод на DEVNULL:
import os import subprocess FNULL = open(os.devnull, 'w') retcode = subprocess.call(['echo', 'foo'], stdout=FNULL, stderr=subprocess.STDOUT)
это фактически то же самое, что выполнить эту команду оболочки:
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.7 x, и это только ошибки, которые вы хотите подавить (специфичные для этого вопроса), Вы можете сделать что-то вроде этого:
output = subprocess.check_output(["arp", "-a", "-N", "127.0.0.2"], stderr=subprocess.STDOUT)
вы должны быть в состоянии проверить с помощью кода выше на вашей системе, но если 127.0.0.2 случается существовать в вашей таблице arp вы можете просто выбрать ip, который не имеет сетевой карты, связанной с ним.
С Python3 вам больше не нужно открывать devnull и можно вызвать подпроцесс.ДЕВНУЛЛ.
ваш код будет обновлен следующим образом:
import subprocess text = 'Hello World.' print text subprocess.call(['espeak', text], stderr=subprocess.DEVNULL)