gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:18:36 30 4
gpt4 key购买 nike

我最近在 Python 中注意到 subprocess.Popen() 有一个参数:

stdout=None(default)

我还看到有人使用 stdout=subprocess.PIPE。

有什么区别?我应该使用哪一个?

另一个问题是,为什么 wait() 函数有时不能等到进程真正完成?我用过:

a = sp.Popen(....,shell=True)
a.wait()
a2 = sp.Popen(...,shell=True)
a2.wait()

有时 a2 命令在命令 a 完成之前执行。

最佳答案

stdout=None 表示,进程的 stdout-handle 直接从父进程继承,简单来说,它基本上意味着,它被打印到控制台(这同样适用于 stderr)。

然后你可以选择 stderr=STDOUT,这会将 stderr 重定向到 stdout,这意味着 stdout< 的输出stderr 被转发到同一个文件句柄。

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

还有一个有趣的事实,您可以将任何 file-object 传递给 stdin/stderr/stdout,例如还有一个用 open 打开的文件(对象必须提供 fileno() 方法)。

你的等等问题。不应该这样!作为解决方法,您可以使用 p.poll() 来检查进程是否退出! wait 调用的返回值是什么?

Furthermore, you should avoid shell=True especially if you pass user-input as first argument ,这可能会被恶意用户用来利用您的程序!它还会启动一个 shell 进程,这意味着额外的开销。当然,在 1% 的情况下您确实需要 shell=True,我无法用您的简约示例来判断这一点。

关于python - 如果我在 subprocess.Popen() 中不使用 stdout=subprocess.PIPE 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19961052/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com