Python:对子进程的顺序调用(在本例中为espeak)

时间:2011-10-01 06:13:58

标签: python subprocess block communicate espeak

我想知道是否有办法在命令行中访问espeak:

laptop:~$espeak
say this line first
say this line second
...

现在,我在python中唯一可以做到的方法是process = subprocess.Popen(['espeak'], stdin=subprocess.PIPE ),然后是

process.communicate(expression)

process.stdin.write(expression)
process.stdin.close()

前者阻止程序的其余部分,直到espeak完成,不是理想的行为,而后者不会阻止但允许重叠的可能性,比如我的程序调用espeak两次太快。我想知道是否有办法在命令行中调用espeak,我可以快速输入多个要说的内容,但它只会说第一个完成后的第二件事,例如。

特别是,上述两个例子都在单个表达式后关闭了espeak。有没有办法避免这种情况?

编辑:由ed。给出的答案是在最后用换行符写,然后刷新

process = subprocess.Popen(['espeak'], stdin=subprocess.PIPE )
process.stdin.write("say this line first\n")
process.stdin.flush()
process.stdin.write("say this line second\n")
process.stdin.flush()

process.stdin.close()

1 个答案:

答案 0 :(得分:3)

您可以尝试调用process.stdin.write(expression),其中expression在结尾处有换行符,而调用process.stdin.close(),直到您完成espeak

如果不起作用,则在写入后添加process.stdin.flush()调用。