Python:对subprocess的顺序调用(以espeak为例)
我在想有没有办法像在命令行里那样使用espeak:
laptop:~$espeak
say this line first
say this line second
...
现在,我在Python中调用espeak的唯一方法是用 process = subprocess.Popen(['espeak'], stdin=subprocess.PIPE )
,然后接着是
process.communicate(expression)
或者
process.stdin.write(expression)
process.stdin.close()
前一种方法会让程序停下来,等espeak完成后才能继续,这样的行为不太好;而后一种方法虽然不会停,但如果我的程序太快调用espeak两次,就可能会出现重叠的情况。我在想有没有办法像在命令行那样调用espeak,可以快速输入多个要说的内容,但只有在第一个说完后,第二个才开始,比如这样。
特别是,上面两个例子在说完一个内容后就关闭了espeak。有没有办法避免这个问题呢?
补充:答案是,在每个内容后加上换行符,然后刷新一下。
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 个回答
3
你可以试着用 process.stdin.write(expression) 来发送表达式,记得在表达式的末尾加一个换行符,并且在你完成使用 espeak 之前,不要调用 process.stdin.close()。
如果这样还不行,那就可以在写入之后加一个 process.stdin.flush() 的调用。