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

sds*_*sds 4 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
Run Code Online (Sandbox Code Playgroud)

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

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

dan*_*ano 7

是的,这是故意的。//当你向构造函数stdout提供kwargs时stdinstderrPopen kwargs 时,您就是在告诉它在子进程中将这些管道定向到何处:

\n\n
\n

stdin、stdout 和 stderr 分别指定执行的程序\xe2\x80\x99s 标准输入、标准输出和标准错误文件句柄。

\n
\n\n

stdout//对象上的属性stdin使用时被记录为仅具有值stderrPopenPIPE

\n\n
\n

波彭标准输入

\n\n

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

\n\n

Popen.stdout

\n\n

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

\n\n

Popen.stderr

\n\n

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

\n
\n\n

至于为什么Popen.std*None当你传递除PIPE,我不确定。也许是因为它被认为是多余的,因为您必须首先将打开的句柄传递给构造函数?

\n