如何将python Popen与espeak和aplay一起使用

如何将python Popen与espeak和aplay一起使用,python,asynchronous,popen,espeak,Python,Asynchronous,Popen,Espeak,我想打电话 espeak -ves -s130 'HEY' --stdout | aplay -D 'sysdefault' 通过subprocess.Popen,使用 espeak_process = Popen(["espeak", "-ves -s100 'HEY' --stdout"], stdout=subprocess.PIPE) aplay_process = Popen(["aplay", "-D 'sysdefault'"], stdin=espeak_process.std

我想打电话

espeak -ves -s130 'HEY' --stdout | aplay -D 'sysdefault'
通过subprocess.Popen,使用

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
你知道如何实现这一点吗?
Thx

您的示例相当于在shell中键入:

$ espeak '-ves -s100 \'HEY\' --stdout'
$ aplay '-D \'sysdefault\''
这显然是错误的。每个列表条目都是传递给可执行文件的一个参数(argv条目),您不需要转义/引用。因此,您要使用:

["aplay", "-D", "sysdefault"]
["espeak", "-ves", "-s100", "HEY", "--stdout"],
另见(我的重点):

所有调用都需要args,args应该是字符串或程序参数序列通常首选提供参数序列,因为它允许模块处理任何必需的参数转义和引用(例如,允许文件名中有空格)。如果传递单个字符串,则shell必须为True(见下文),否则该字符串必须仅命名要执行的程序,而不指定任何参数


是的,它很有魅力,非常感谢:)*如果你回答一个问题,我会把它标记为解决方案