当我创建一个文件流为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
成为文件流。)
答案 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*
以外的句柄时,为什么None
为PIPE
,我不确定。也许是因为它被认为是多余的,因为你必须将一个打开的句柄传递给构造函数以开始?