如何在将 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 上的输出显示在控制台上,同时输出到 stdout
在 res.stdout
.
中被捕获
当 运行 来自 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 上的输出显示在控制台上,同时输出到 stdout
在 res.stdout
.