如何在使用超时时从 Python 的 subprocess.run 捕获错误

how to capture error from python's subprocess.run, while using timeout

提问人:Marc B. Hankin 提问时间:10/16/2020 更新时间:10/17/2020 访问量:266

问:

我无法弄清楚如何使用 python 的 subprocess.run 来捕获 stdout、stderr 和 exitcode ......以及任何其他可以捕获的东西。我还必须使用超时选项,因为我正在运行的数千个命令中的一些命令挂起,即无休止地运行。我敢打赌我错过了一些明显的东西,我道歉。我花了好几天时间研究这个问题,但无法弄清楚。

您能给我的任何帮助将不胜感激。

这是我有缺陷的代码:

seconds = timeout
try:
    proc = subprocess.run(cmd, capture_output=True, timeout=seconds)

except subprocess.TimeoutExpired:
    print('This process ran too long:\n' + cmd + '\n')
        
out, err = proc.communicate()
exitcode = proc.returncode

if len(out) == 0: out="''"
if len(err) == 0: err="''"
#
return exitcode, out, err
子进程 超时 python-3.7 通信

评论


答:

1赞 MHankin 10/17/2020 #1

你快到了。而不是

out, err = proc.communicate()

out, err = proc.stdout, proc.stderr

关于你的 except 子句,我不确定你是否能够在超时后获得 stdout、stderr 和 returncode。给它一个检查。如果没有,那么在你的 except 子句中考虑或类似的东西。return "", "", 1