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

时间:2014-08-18 19:06:44

标签: python subprocess

当我创建一个文件流为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成为文件流。)

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

1 个答案:

答案 0 :(得分:4)

是的,这是故意的。当您向Popen constructor提供stdout / stdin / stderr个kwargs时,您告诉它在子进程中将这些管道指向何处:

  

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

stdout对象are documented as only having a value when you use PIPE上的stdin / stderr / Popen属性:

  

<强> Popen.stdin

     

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

     

<强> Popen.stdout

     

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

     

<强> Popen.stderr

     

如果stderr参数是PIPE,则此属性是一个文件对象,它提供子进程的错误输出。否则就是   无。

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