Python: последовательные вызовы подпроцесса (в данном случае espeak) - PullRequest
4 голосов
/ 01 октября 2011

Мне было интересно, есть ли способ получить доступ к 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, как в командной строке, где я мог бы быстро ввести несколько слов для выступления, но он сказал бы только второе после первого завершения, например.

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

Редактировать: Ответ, данный ред., Состоит в том, чтобы писать с символами новой строки в конце и затем сбрасывать

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 голосов
/ 01 октября 2011

Вы можете попробовать вызвать process.stdin.write (expression), где выражение в конце имеет новую строку, а не не вызывает process.stdin.close (), пока вы не закончите с espeak.

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

...