我最近在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命令 .
2 回答
stdout=None
表示,来自进程的stdout
-handle直接从父进程继承,更简单的说法就是它,它被打印到控制台(同样适用于stderr
) .然后你有
stderr=STDOUT
选项,这会将stderr
重定向到stdout
,这意味着stdout
和stderr
的输出被转发到同一个文件句柄 .如果设置
stdout=PIPE
,Python会将数据从进程重定向到新的文件句柄,可以通过p.stdout
(p
beeing aPopen
object)进行访问 . 您可以使用它来捕获进程的输出,或者使用stdin
来将数据(不断地)发送到stdin
. 但大多数情况下你想使用p.communicate
,它允许你将数据发送到进程一次(如果你需要),如果进程完成,则返回完整的stderr
和stdout
!另一个有趣的事实是,你可以将
file-object
传递给stdin/stderr/stdout
,例如也是用open
打开的文件(该对象必须提供fileno()
方法) .你的_2825421问题 . 情况应该不是这样!作为解决方法,您可以使用
p.poll()
来检查进程是否已退出!wait
电话的返回值是多少?Furthermore, you should avoid shell=True especially if you pass user-input as first argument,恶意用户可以使用它来利用您的程序!它还启动了一个shell进程,这意味着额外的开销 . 当然,有1%的情况下你真的需要
shell=True
,我不能用你的简约例子判断这一点 .stdout=None
表示子进程打印到脚本打印的任何位置stdout=PIPE
表示子进程'stdout被重定向到您应该读取的管道,例如,使用process.communicate()
一次读取所有内容或使用process.stdout
对象通过文件/迭代器接口读取