当我用文件流作为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
,我不确定。也许是因为它被认为是多余的,因为您必须首先向构造函数传递一个打开的句柄?