Python 为什么';t subprocess.Popen(…)是否始终返回?

Python 为什么';t subprocess.Popen(…)是否始终返回?,python,subprocess,Python,Subprocess,我希望这是一个简单的python问题 在python解释器中尝试以下操作时: >>> import process >>> def test(cmd): ... p = subprocess.Popen(cmd) ... >>> test(['ls', '-l']) 它将运行ls-l,但我需要点击“return”以获得一个新的>>>提示 但是,当我尝试以下操作时: >>> import process >>

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

谢谢


查理

我可能已经回答了我自己的问题。我相信在最后一种情况下,我需要显式地读取p.stdout,以便继续我的过程

即:


感谢第一个变体中的所有内容,
test()
在进程启动后立即返回,但在其输出发送到控制台之前返回

如果您查看输出,确实会在
ls
的输出之前得到提示

>>> test(['ls', '-l'])
>>> total 0                            <----- test() returns, new propmpt
--rw-r--r--    1 foo bar   7 Mar 24 17:38
etc etc
测试(['ls','-l']) >>>总计0只需使用communicate()方法。无需返回

>>> test(['ls', '-l'])
>>> 
>>> def test(cmd):
...    p = subprocess.Popen(cmd).communicate()
... 
>>> test(['ls', '-l'])

这是一个永远ping Google的命令,因此需要手动终止它以检索输出

有关将os.popen()方法调用转换为完整的subprocess.popen类的说明,请参阅

host = "www.google.com"
command = "ping %s -t"%host

#p = os.popen(command) -- using Popen instead of os.popen() to allow calling terminate()
p = Popen(command, stdout=subprocess.PIPE)

time.sleep(5)
print "term"
p.terminate()
pingResultSoFar = p.communicate()[0] # get what has been printed to standard out so far
print pingResultSoFar

如果不重定向sub命令的任何std处理程序,
.communicate()
将不会做任何有用的事情。最好用
wait()
调用替换它。
host = "www.google.com"
command = "ping %s -t"%host

#p = os.popen(command) -- using Popen instead of os.popen() to allow calling terminate()
p = Popen(command, stdout=subprocess.PIPE)

time.sleep(5)
print "term"
p.terminate()
pingResultSoFar = p.communicate()[0] # get what has been printed to standard out so far
print pingResultSoFar