我最近在Python中注意到subprocess.Popen()有一个参数:
stdout=None(default)
我也看到人们使用stdout = subprocess.PIPE.
有什么区别?我应该使用哪一个?
另一个问题是,为什么wait()函数不能等到有时完成进程?我用了:
a = sp.Popen(....,shell=True)
a.wait()
a2 = sp.Popen(...,shell=True)
a2.wait()
有时在命令a完成之前执行a2命令.
解决方法:
stdout = None表示来自进程的stdout-handle直接从父进程继承,更简单的说法就是它,它被打印到控制台(同样适用于stderr).
然后你有stderr = STDOUT选项,这会将stderr重定向到stdout,这意味着stdout和stderr的输出被转发到同一个文件句柄.
如果设置stdout = PIPE,Python会将数据从进程重定向到新的文件句柄,可以通过p.stdout访问(p beeing一个Popen对象).您可以使用它来捕获进程的输出,或者使用stdin将数据(不断地)发送到stdin的情况.
但大多数情况下你想使用p.communicate,它允许你将数据发送到进程一次(如果你需要),如果进程完成,则返回完整的stderr和stdout!
另一个有趣的事实是,您可以将任何文件对象传递给stdin / stderr / stdout,例如也是用open打开的文件(该对象必须提供fileno()方法).
等你的等待问题.情况应该不是这样!作为解决方法,您可以使用p.poll()来检查进程是否已退出!等待通话的回报值是多少?
Furthermore, you should avoid shell=True
especially if you pass user-input as first argument,恶意用户可以使用它来利用您的程序!它还启动了一个shell进程,这意味着额外的开销.当然,有1%的情况下你实际上需要shell = True,我不能用你的简约例子判断这一点.