我希望这是一个简单的python问题。
当我在python解释器中尝试以下操作时:
>>> import process
>>> def test(cmd):
... p = subprocess.Popen(cmd)
...
>>> test(['ls', '-l'])
它将运行
ls -l
,但是我需要点击“return”以获取新的>>>提示。但是,当我尝试以下操作时:
>>> import process
>>> def test(cmd):
... p = subprocess.Popen(cmd)
... p.wait()
...
>>> test(['ls', '-l'])
然后,
ls -l
将运行,并立即显示>>>提示。另一种变化:
>>> import process
>>> def test(cmd):
... p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
...
>>> test(['ls', '-l'])
这将立即给我新的提示。
最后一个例子最接近我想要的。我的目标是启动一个子进程,等待其完成,然后通过引用
p.stdout
在我的父进程中使用其stdout,同时让stderr可以打印到其他地方。现在在我的实际应用程序中,最后一个版本卡在:
带有或不带有
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
的p.wait()
。谢谢,
查理
最佳答案
在第一个变体中,test()
在启动该过程之后但在将其输出发送到控制台之前立即返回。
如果查看输出,则会在ls
输出之前得到提示。
>>> test(['ls', '-l'])
>>> total 0 <----- test() returns, new propmpt
--rw-r--r-- 1 foo bar 7 Mar 24 17:38
etc etc
在第二个变体中,
test()
在返回之前等待进程终止。在第三个版本中,您可能必须从子进程的
stdout
中读取内容才能继续,这是正确的。关于python - 为什么subprocess.Popen(...)总是不返回?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/694000/