fra*_*uao 7 python subprocess stdout
我最近在Python中注意到subprocess.Popen()有一个论点:
stdout=None(default)
Run Code Online (Sandbox Code Playgroud)
我也看到人们使用stdout = subprocess.PIPE.
有什么不同?我应该使用哪一个?
另一个问题是,为什么wait()函数不能等到有时完成进程?我用了:
a = sp.Popen(....,shell=True)
a.wait()
a2 = sp.Popen(...,shell=True)
a2.wait()
Run Code Online (Sandbox Code Playgroud)
有时在命令a完成之前执行a2命令.
dav*_*v1d 15
stdout=None意味着,stdout来自进程的-handle直接从父进程继承,更简单的说法就是它,它被打印到控制台(同样适用stderr).
然后你有了选项stderr=STDOUT,这会重定向stderr到stdout,这意味着输出stdout和stderr转发到同一个文件句柄.
如果设置stdout=PIPE,Python会将数据从进程重定向到新的文件句柄,该文件句柄可以通过p.stdout(p使用Popen对象)进行访问.您可以使用它来捕获进程的输出,或者用于stdin(不断地)发送数据的情况stdin.但大多数情况下你想使用它p.communicate,它允许你将数据发送到进程一次(如果你需要)并返回完成stderr,stdout如果进程完成!
还有一个有趣的事实,你可以通过任何file-object到stdin/stderr/stdout,例如还一个文件打开open(对象必须提供一个fileno()方法).
对你的wait问题.情况应该不是这样!作为解决方法,您可以使用p.poll()检查进程是否退出!wait电话的回报值是多少?
此外,您应该避免shell=True特别是如果您将用户输入作为第一个参数传递,恶意用户可能会使用它来利用您的程序!它还启动了一个shell进程,这意味着额外的开销.当然,有1%的情况下你确实需要shell=True,我不能用你的简约例子来判断.
stdout=None 意味着子进程打印到您的脚本打印的任何位置stdout=PIPE意味着子进程的标准输出被重定向到一个你应该读取的管道,例如,使用process.communicate()一次读取所有内容或使用process.stdout对象通过文件/迭代器接口读取