gpt4 book ai didi

python - 当出现异常时捕获 subprocess.Popen 的标准输出

转载 作者:行者123 更新时间:2023-12-01 00:44:46 29 4
gpt4 key购买 nike

当出现异常时,如何从 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_stdocmd_stde 中获取 CMD 标准输出

我尝试将它放在try,exception block 中,它是NULL。而且,我非常确定运行 CMD 时有输出。

最佳答案

如果超时,变量 cmd_stdocmd_stde 永远不会被赋值,因为异常发生在赋值之前。

为了确保即使在异常情况下也能捕获 stdoutstderr,我会捕获到(临时)文件并随后将它们读入变量中。

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com