如何使用python Popen与espeak和aplay

时间:2015-01-12 23:31:37

标签: 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.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

1 个答案:

答案 0 :(得分:4)

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

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

这显然是错误的。每个列表条目都是传递给可执行文件的一个参数(argv条目),不需要转义/引用。所以你想使用:

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

另见the documentation(强调我的):

  

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