Python调用subprocess报子进程仍运行ResourceWarning 如何干净终止?
干净终止subprocess子进程避免ResourceWarning的方案
ResourceWarning的核心原因是子进程终止后父进程没有主动回收其退出状态,导致系统残留僵尸进程条目;或是单元测试执行到收尾检查时,子进程还未完全完成退出逻辑。
1. 主动回收子进程资源(最推荐)
你需要先保存Popen调用返回的进程对象,在套接字断开、确认子进程需要终止后,主动等待进程退出、回收资源:
import subprocess # 启动时保存进程实例 proc = subprocess.Popen('python {}'.format("script_name.py"), shell=True) # 通信结束后的收尾逻辑 try: # 最多等待5秒让子进程主动退出 proc.wait(timeout=5) except subprocess.TimeoutExpired: # 超时后强制杀死进程 proc.kill() # 再次等待回收杀死后的进程资源 proc.wait()
2. 去掉shell=True减少中间进程残留
使用shell=True会额外启动一层shell进程来包裹你的目标Python脚本,套接字断开后只会终止Python子进程,外层shell进程可能残留导致警告。建议直接启动Python进程,不需要shell中转:
import sys import subprocess # sys.executable会自动匹配当前父进程使用的Python解释器,避免版本不匹配 proc = subprocess.Popen([sys.executable, "script_name.py"])
3. 单元测试适配处理
如果使用pytest等测试框架,可以在测试用例的teardown阶段统一执行子进程回收逻辑。确认没有资源泄漏的前提下,也可以临时过滤该警告(仅建议临时调试用):
import warnings warnings.filterwarnings("ignore", category=ResourceWarning, message="subprocess .* is still running")
内容的提问来源于stack exchange,提问作者Yes
相关产品推荐
相关产品推荐

