当前位置:  开发笔记 > 编程语言 > 正文

为什么不subprocess.Popen(...)总是返回?

如何解决《为什么不subprocess.Popen()总是返回?》经验,为你挑选了2个好方法。

我希望这是一个简单的python问题.

当我在python解释器中尝试以下内容时:

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

它将运行ls -l,但我需要点击"返回"以获得新的>>>提示.

但是,当我尝试以下内容时:

>>> 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().

谢谢,

查理



1> dF...:

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



2> 小智..:

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

即:

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

谢谢大家

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有