Как использовать Python Popen с espeak и aplay

Я пытаюсь позвонить

espeak -ves -s130 'HEY' --stdout | aplay -D 'sysdefault'

через подпроцесс. Открыть, с

espeak_process = Popen(["espeak", "-ves -s100 'HEY' --stdout"], stdout=subprocess.PIPE)
aplay_process = Popen(["aplay", "-D 'sysdefault'"], stdin=espeak_process.stdout, stdout=subprocess.PIPE)

Но это не работает

ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM  'sysdefault'
aplay: main:682: audio open error: No such file or directory

Есть идеи, как это реализовать? Спасибо

1 ответ

Решение

Ваш пример эквивалентен вводу этого в оболочке:

$ espeak '-ves -s100 \'HEY\' --stdout'
$ aplay '-D \'sysdefault\''

Что явно не так. Каждая запись в списке представляет собой один аргумент (запись argv), передаваемый исполняемому файлу, с вашей стороны не требуется экранирование / цитирование. Итак, вы хотите использовать:

["aplay", "-D", "sysdefault"]
["espeak", "-ves", "-s100", "HEY", "--stdout"],

Также см. Документацию (выделено мое):

Аргументы требуются для всех вызовов и должны быть строкой или последовательностью аргументов программы. Предоставление последовательности аргументов обычно предпочтительнее, поскольку позволяет модулю позаботиться о любом необходимом экранировании и цитировании аргументов (например, чтобы разрешить пробелы в именах файлов). Если передается одна строка, либо shell должен иметь значение True (см. Ниже), либо строка должна просто указывать имя программы, которая должна быть выполнена, без указания каких-либо аргументов.

Другие вопросы по тегам