本地自动化脚本里经常会调外部命令,比如压缩、探测版本、跑一段转换。最怕的是子进程一直不退出,整个任务挂在那里。subprocess.run() 自带 timeout,够很多小脚本用了。
环境:Python 3.10+,Linux/macOS/Windows,只用标准库。保存为 subprocess-timeout-demo.py:
import subprocess
import sys
cmd = [
sys.executable,
"-c",
"import time; print('child start', flush=True); time.sleep(5); print('child done')",
]
try:
result = subprocess.run(
cmd,
text=True,
capture_output=True,
timeout=1,
check=True,
)
print(result.stdout)
except subprocess.TimeoutExpired as error:
print(f"timeout after {error.timeout}s")
if error.stdout:
print("partial stdout:", error.stdout)
跑一下:
python3 subprocess-timeout-demo.py
小坑是 TimeoutExpired.stdout 在某些情况下可能是 bytes/None,所以真要记录日志时最好做一下兼容处理。只是想让任务别无限等的话,先加这个就很省心。