subprocess.Popen(cl,…,shell = True)不能像shell命令转发器一样工作

问题描述 投票:0回答:1

我的目标是让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代码却没有。为什么?

python python-2.7 subprocess
1个回答
1
投票

您没有等待任何过程完成。为了使其等效于逐个运行shell命令,您需要在每个process.wait()之后放置一个Popen调用,以便该命令在启动下一个进程之前完成。在这种情况下,aplay取决于pico2wave写出aplay的输入,并且取决于rm在有机会打开它并读取内容之前不删除它。

没有process.wait(),就像在shell中运行(请注意将&作为背景:

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

介绍各种可怕的比赛条件。

© www.soinside.com 2019 - 2024. All rights reserved.