Я использую eSpeak в Ubuntu и у меня есть скрипт Python 2.7, который печатает и произносит сообщение:
import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])
eSpeak производит желаемые звуки, но загромождает оболочку некоторыми ошибками (ALSA lib ..., нет подключения к сокету), поэтому я не могу легко прочитать то, что было напечатано ранее. Код выхода 0.
К сожалению, нет задокументированной опции для отключения его многословия, поэтому я ищу способ только визуально заставить его замолчать и сохранить открытую оболочку в чистоте для дальнейшего взаимодействия.
Как я могу это сделать?
python
python-2.7
subprocess
espeak
rypel
источник
источник
os.system
синтаксис. Хотя это только для иллюстрации. Палка с подпроцессомsubprocess.DEVNUL
решение.Ответы:
Перенаправить вывод в DEVNULL:
Фактически это то же самое, что и выполнение этой команды оболочки:
источник
os.devnull
еслиsubprocess.DEVNULL
недоступен (<3.3), использоватьcheck_call()
вместо,call()
если вы не проверяете возвращаемый код, открывайте файлы в двоичном режимеstdin/stdout/stderr
, использованиеos.system()
не рекомендуется,&>
дляsh
Ubuntu явное>/dev/null 2>&1
может быть использовано.os.devnull
но случайно набрал его. Кроме того, я придерживаюсь использования OP,call
поскольку они не улавливают возможное исключениеcheck_call
. И дляos.system
перенаправления это было больше просто иллюстрацией того, что делает эффективное использование подхода подпроцесса. Не совсем как второе предложение.close_fds=True
в ,subprocess.call
чтобы закрытьFNULL
дескриптор после подпроцесса существуетclose_fds=True
, файловые дескрипторы закрываются после,fork()
но до,execvp()
т. е. они закрываются в дочернем процессе непосредственно перед запуском исполняемого файла.close_fds=True
не будет работать в Windows, если любой из потоков перенаправлен .close_fds
не закрывает файлы в родительском процессе.Вот более портативная версия (просто для удовольствия, в вашем случае она не нужна):
источник
DEVNULL
что он не является полностью общим, как тот, который предоставляетсяsubprocess
; так как он открыт,wb
он не может быть использован дляstdin
.'r+b'
режим, если он вам нужен.Использование
subprocess.check_output
(новое в Python 2.7). Это подавит стандартный вывод и вызовет исключение в случае сбоя команды. (На самом деле он возвращает содержимое стандартного вывода, поэтому вы можете использовать его позже в своей программе, если хотите.) Пример:Вы также можете подавить stderr с помощью:
Для ранее чем 2.7 используйте
Здесь вы можете подавить stderr с
источник
except subprocess.CalledProcessError as e
а затем использоватьe.code
илиe.output
Начиная с Python3 вам больше не нужно открывать devnull и вы можете вызывать subprocess.DEVNULL .
Ваш код будет обновлен как таковой:
источник
stderr
сstdout
в коде выше (или добавить в качестве еще одного аргумента) для подавления выходов. «Выходы» есть в названии вопроса и что привело меня сюда ... может быть, тривиально, но думал, что стоит упомянуть.Почему бы не использовать command.getoutput () вместо этого?
источник
text
есть кавычки, или использует другую кодировку символов, или слишком велик для командной строки в) он только для Unix (на Python 2)