subprocess.Popen (cl, ..., shell = True) не работает как перенаправитель команд оболочки - PullRequest
0 голосов
/ 25 сентября 2019

Моя цель - заставить pico2wave говорить на python.

Мой код

cl = 'pico2wave --lang=de-DE --wave=/tmp/test.wav "Test"'
print(cl)
tempFile = '/dev/null'
with open(tempFile, "w+") as f:
  process = subprocess.Popen(cl, stdout=f, shell=True)
  cl = 'aplay /tmp/test.wav'
  print(cl)
  process = subprocess.Popen(cl, stdout=f, shell=True) 
  cl = 'rm -f /tmp/test.wav'
  print(cl)
  process = subprocess.Popen(cl, stdout=f, shell=True) 

Использование вывода на печать в командной строке работает.Но с кодом Python это не так.Почему?

1 Ответ

1 голос
/ 25 сентября 2019

Вы не дожидались завершения каких-либо процессов.Чтобы сделать его эквивалентным выполнению команд оболочки по одной, вам нужно ставить вызов process.wait() после каждого Popen, чтобы команда заканчивалась до запуска следующего процесса.В этом случае aplay зависит от pico2wave, записывающего ввод aplay, и зависит от того, rm не удалит его до того, как у него появится возможность открыть его и прочитать содержимое.

Безprocess.wait(), это все равно что запустить (обратите внимание на фон &) это в оболочке:

pico2wave --lang=de-DE --wave=/tmp/test.wav "Test" &
aplay /tmp/test.wav &
rm -f /tmp/test.wav &

, которая вводит все виды ужасных условий гонки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...