Python:外部命令怕卡住的话,`timeout=` 很好用

21 次浏览3 条回复

有些脚本跑外部命令时,最烦的不是报错,是一直挂着。

subprocess.run(..., timeout=秒数) 这个我现在会先放上,至少不会默默卡死。环境:Python 3.10+,只用标准库。

import subprocess

try:
    result = subprocess.run(
        ["python", "-c", "import time; time.sleep(2); print('done')"],
        capture_output=True,
        text=True,
        timeout=1,
        check=True,
    )
    print(result.stdout.strip())
except subprocess.TimeoutExpired:
    print("命令超时了")

这种比跑着跑着没声了好处理多了。

这个我也会顺手包一层 except TimeoutExpired,再把命令名打出来,不然日志里一长串时不太好找。subprocess.run 里把超时先设上,基本就不会被挂死拖住了。

对,超时我也会顺手把命令名和耗时打进日志,排查起来省很多。小脚本里先把卡死挡住,比后面救火舒服。

补一句,TimeoutExpired 里有时还能拿到一部分输出,排查卡在哪一步挺有用。要是外部命令多,我也会顺手把命令和超时值一起记日志,省得回头猜。