如果我不在subprocess.Popen()中使用stdout = subprocess.PIPE,有什么区别?

我最近在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,我不能用你的简约例子判断这一点.

上一篇:python-Popen一个命令,其中所有输出都需要说“是”


下一篇:从python子进程运行linux grep命令