6

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

这会给我一个立即的新提示。

最后一个例子最接近我想要的。我的目标是启动一个子进程,等待它完成,然后通过引用在我的父进程中使用它的 stdout,p.stdout同时让 stderr 打印到其他地方。

现在在我的实际应用程序中,最后一个版本只是挂在: p = subprocess.Popen(cmd, stdout=subprocess.PIPE)有或没有p.wait().

谢谢,

查理

4

4 回答 4

8

在第一个变体中,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它才能继续。

于 2009-03-29T03:47:51.917 回答
7

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

IE:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
output = p.stdout.readlines()
....

谢谢大家

于 2009-03-29T02:35:19.577 回答
0

Just use communicate() method.No need to return.

>>> test(['ls', '-l'])
>>> 
>>> def test(cmd):
...    p = subprocess.Popen(cmd).communicate()
... 
>>> test(['ls', '-l'])
于 2014-02-20T09:46:46.980 回答
0

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

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

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
于 2014-08-22T18:17:12.413 回答