如何在将 stdout 作为字符串返回时流式传输子进程的 stderr?

How do I stream a subprocess's stderr while returning stdout as string?

当 运行 来自 Python 3.9 的子进程时,我想将标准输出捕获为字符串。同时,我希望将标准错误流式传输到我的控制台以调试那个冗长的子进程。

Popen.communicate() 有相关的功能,但似乎 subprocess 作为高级 API 更可取;而且我不确定如何分别处理这两个流。

这段代码returns将他们两个作为字符串。我怎样才能流式传输 stderr?

process = subprocess.run( ['sh', script], capture_output=True, text=True, env=env)
if process.returncode:
     raise Exception(f"Error {process.returncode} {process.stderr}")
return process.stdout

如果您阅读 the documentation,您会注意到 capture_output 不是您想要的:

If capture_output is true, stdout and stderr will be captured.

如果要捕获 stdout 而不是 stderr,只需设置 stdout=subprocess.PIPE。如果我有一个名为 script.sh 的脚本,其中包含:

#!/bin/sh

echo "This is normal output"
echo "This is an error" >&2

我可以像这样捕获输出:

>>> res = subprocess.run(['sh', 'script.sh'], stdout=subprocess.PIPE)
This is an error
>>> res.stdout
b'This is normal output\n'

stderr 上的输出显示在控制台上,同时输出到 stdoutres.stdout.

中被捕获