Python子流程stderr/stdout字段在创建时为None

Python子流程stderr/stdout字段在创建时为None,python,subprocess,Python,Subprocess,当我创建一个文件流为stderr或stdout的python子流程时,相应的字段为None: 我希望s.stderr是文件流 这是否有文件记录/有意为之? 理由是什么? 是的,这是故意的。当您向提供stdout/stdin/stderr-kwargs时,您告诉它在子进程中将这些管道指向何处: stdin、stdout和stderr指定执行程序的标准 输入、标准输出和标准错误文件句柄 但是Popen对象上的stdout/stdin/stderr属性: 波本·斯丁 如果stdin参数是PIPE,则此

当我创建一个文件流为stderr或stdout的python子流程时,相应的字段为None:

我希望s.stderr是文件流

这是否有文件记录/有意为之? 理由是什么?
是的,这是故意的。当您向提供stdout/stdin/stderr-kwargs时,您告诉它在子进程中将这些管道指向何处:

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

但是Popen对象上的stdout/stdin/stderr属性:

波本·斯丁

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

Popen.stdout

如果stdout参数是PIPE,则此属性是提供子进程输出的文件对象。否则就没有了

Popen.stderr

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


至于为什么当你通过管道以外的手柄时Popen.std*是空的,我不确定。可能是因为它被认为是多余的,因为您必须首先向构造函数传递一个打开的句柄?

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

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

但是Popen对象上的stdout/stdin/stderr属性:

波本·斯丁

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

Popen.stdout

如果stdout参数是PIPE,则此属性是提供子进程输出的文件对象。否则就没有了

Popen.stderr

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

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

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