我希望这是一个简单的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/

10-13 06:44