Python子进程stderr/stdout字段如果创建则为None



当我用文件流作为stderr(或stdout)创建python子进程时,相应的字段是None:

s = subprocess.Popen(['ls','qwer'],
                     stdout=subprocess.PIPE,
                     stdin=subprocess.PIPE,
                     stderr=open("zzzzz",'wb'))
s.stderr is None
==> True

(我期望s.stderr是文件流)。

  • 这是有记录的/故意的吗?
  • 理由是什么?

是的,这是有意为之。当您向Popen构造函数提供stdout/stdin/stderr kwargs时,您告诉它在子进程中将这些管道定向到哪里:

stdin、stdout和stderr指定被执行程序的标准输入、标准输出和标准错误文件句柄。

但是Popen对象上的stdout/stdin/stderr属性只有在使用PIPE时才有值:

Popen.stdin

如果stdin参数是PIPE,这个属性是一个文件对象,为子进程提供输入。否则为None。

Popen.stdout

如果stdout参数为PIPE,则该属性是一个文件对象,提供子进程的输出。否则为None。

Popen.stderr

如果stderr参数为PIPE,则该属性是一个文件对象,提供子进程的错误输出。否则,为没有。

当你传递PIPE以外的句柄时,为什么Popen.std*None,我不确定。也许是因为它被认为是多余的,因为您必须首先向构造函数传递一个打开的句柄?

最新更新