2011-10-01 5 views
4

мне было интересно, если есть способ получить доступ к озвучки, как вы могли бы в командной строке:Python: последовательные вызовы подпроцесс (в данном случае, озвучка)

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

Прямо сейчас, единственный способом я могу сделать это в питона process = subprocess.Popen(['espeak'], stdin=subprocess.PIPE), а затем либо

process.communicate(expression) 

или

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

бывших блоков отдыха программы до тех пор, пока espeak не завершится, нежелательное поведение, в то время как последнее не блокирует, но допускает возможность перекрытия, скажем, если моя программа вызывает espeak дважды слишком быстро. Мне было интересно, есть ли способ вызвать espeak, как в командной строке, где я мог бы быстро вводить несколько вещей, чтобы говорить, но он сказал бы только вторую вещь после первого завершения, например.

В частности, оба примера выше закрывают espeak после одного выражения. Есть ли способ избежать этого?

Edit:. Ответ дается ред, чтобы написать с новой строкой в ​​конце, то флеш

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() 

ответ

3

Вы могли бы попробовать вызвать process.stdin.write (выражение), где выражение имеет символ новой строки на end и do вызовите process.stdin.close(), пока вы не закончите с espeak.

Если это не сработает, добавьте вызов process.stdin.flush() после записи.

+0

Ввод '\ n' в конце' выражения' и промывки работает, спасибо! – scarlet