Python 如果我不';是否在subprocess.Popen()中使用stdout=subprocess.PIPE?

Python 如果我不';是否在subprocess.Popen()中使用stdout=subprocess.PIPE?,python,subprocess,stdout,Python,Subprocess,Stdout,我最近在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

我最近在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=PIPE
    表示子流程的stdout被重定向到您应该读取的管道,例如,使用
    process.communicate()
    一次读取全部,或使用
    process.stdout
    对象通过文件/迭代器接口读取

stdout=None
意味着进程的
stdout
-句柄直接从父进程继承,简单地说,它基本上意味着它被打印到控制台(同样适用于
stderr

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

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

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

您的
等待
问题。不应该是这样!作为解决方法,您可以使用
p.poll()
检查流程是否已退出!
wait
调用的返回值是多少


,这可能被恶意用户用来攻击您的程序!它还启动了一个shell进程,这意味着额外的开销。当然,在1%的情况下,你实际上需要
shell=True
,我不能用你的极简示例来判断这一点。

在其他示例中,是否有人在下一个流程中使用一个流程的输出作为输入?你如何确定子流程没有真正完成
process.wait()
在子进程退出之前不会返回,但如果子进程有自己的子进程,则它可能在所有子进程完成之前退出。您不能只传递任何文件对象。它应该是一个具有有效
.fileno()
的文件对象,例如,
StringIO()
将不起作用。是的,我知道,但我不想像
那样编写
文件,因为
StringIO
类似于
文件,知道如何正确表达它吗?“任何具有
.fileno()
方法返回现有文件描述符的对象”例如,当我也在寻找答案时,我发现了这一点。然而,我并不完全理解答案——那么,使用
stdout=subprocess.PIPE是否可以?@yan:使用
stdout=PIPE
当且仅当您打算从进程读取
stdout
时。清楚吗?