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

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,这会重定向stderrstdout,这意味着输出stdoutstderr转发到同一个文件句柄.

如果设置stdout=PIPE,Python会将数据从进程重定向到新的文件句柄,该文件句柄可以通过p.stdout(p使用Popen对象)进行访问.您可以使用它来捕获进程的输出,或者用于stdin(不断地)发送数据的情况stdin.但大多数情况下你想使用它p.communicate,它允许你将数据发送到进程一次(如果你需要)并返回完成stderr,stdout如果进程完成!

还有一个有趣的事实,你可以通过任何file-objectstdin/stderr/stdout,例如还一个文件打开open(对象必须提供一个fileno()方法).

对你的wait问题.情况应该不是这样!作为解决方法,您可以使用p.poll()检查进程是否退出!wait电话的回报值是多少?

此外,您应该避免shell=True特别是如果您将用户输入作为第一个参数传递,恶意用户可能会使用它来利用您的程序!它还启动了一个shell进程,这意味着额外的开销.当然,有1%的情况下你确实需要shell=True,我不能用你的简约例子来判断.

  • @yan:使用“stdout=PIPE”**当且仅当**您打算从进程“stdout”中读取内容。清楚吗? (2认同)

jfs*_*jfs 5

  • stdout=None 意味着子进程打印到您的脚本打印的任何位置
  • stdout=PIPE意味着子进程的标准输出被重定向到一个你应该读取的管道,例如,使用process.communicate()一次读取所有内容或使用process.stdout对象通过文件/迭代器接口读取