当出现异常时,如何从 subprocess.Popen CMD 调用捕获 stdout/stderr?
代码片段:
p_cmd = subprocess.Popen(CMD, bufsize=0, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(cmd_stdo, cmd_stde) = p_cmd.communicate(timeout=60)
如果 CMD 运行时间超过 60 秒
,超时
,我如何在 cmd_stdo
或 cmd_stde 中获取 CMD 标准输出
?
我尝试将它放在try,exception
block 中,它是NULL。
而且,我非常确定运行 CMD 时有输出。
最佳答案
如果超时,变量 cmd_stdo
和 cmd_stde
永远不会被赋值,因为异常发生在赋值之前。
为了确保即使在异常情况下也能捕获 stdout
和 stderr
,我会捕获到(临时)文件并随后将它们读入变量中。
import subprocess
from tempfile import TemporaryFile as Tmp
CMD = [ 'echo "before sleep" ; sleep 7 ; echo "after sleep"' ]
with Tmp() as out, Tmp() as err:
p_cmd = subprocess.Popen(CMD, bufsize=0, shell=True, stdin=None, stdout=out, stderr=err)
timed_out = False
try:
p_cmd.wait(timeout=5)
except subprocess.TimeoutExpired:
timed_out = True
out.seek(0)
err.seek(0)
str_out = out.read()
str_err = err.read()
print('Has timed out:', timed_out)
print('Stdout:', str_out)
print('Stderr:', str_err)
(尝试此操作时,请在代码中使用 sleep 和超时时间来决定超时是否发生)
关于python - 当出现异常时捕获 subprocess.Popen 的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57072731/