You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python脚本内部实现自身重启并清理原有进程?

实现Python机器人无残留自重启方案

问题现状

当前用os.system("py main.py")实现重启,每次都会生成新的Python进程,导致虚拟机中进程堆积、资源持续消耗。已尝试os.execv(sys.executable, [os.path.basename(sys.executable)] + sys.argv)、os.execl(sys.executable, sys.executable, *sys.argv)等常规方法但无效,机器人运行时依赖chromedriver,需同步处理关联进程的清理。

解决方案

要实现无残留重启,核心是先清理所有关联子进程(比如chromedriver),再用exec系列函数替换当前进程,而非创建新进程。

1. 清理关联资源(关键步骤)

重启前必须终止所有chromedriver子进程,否则这些进程会残留占用资源。可以用psutil库实现进程清理:

import psutil
import os
import sys

def cleanup_resources():
    # 获取当前进程实例
    current_proc = psutil.Process(os.getpid())
    # 递归查找所有子进程
    for child_proc in current_proc.children(recursive=True):
        # 匹配chromedriver进程并终止
        if "chromedriver" in child_proc.name().lower():
            child_proc.terminate()
    # 等待子进程退出,超时则强制杀死
    _, alive_procs = psutil.wait_procs(current_proc.children(recursive=True), timeout=3)
    for proc in alive_procs:
        proc.kill()

2. 无进程堆积的重启实现

使用os.execv替换当前进程,这个函数会直接将当前进程的内存空间替换为新程序的内容,原进程会被销毁,不会留下父进程:

def restart_program():
    cleanup_resources()
    # 传递正确的执行路径和参数:sys.executable是当前Python解释器路径,sys.argv是启动参数
    os.execv(sys.executable, [sys.executable] + sys.argv)

为什么之前的exec方法无效?

  • 未清理chromedriver等子进程:即使主进程被替换,子进程仍会残留,导致看起来“重启没生效”或资源持续占用;
  • 参数格式错误:部分系统下os.path.basename(sys.executable)可能无法正确定位解释器,直接使用sys.executable作为参数更可靠。

使用注意事项

  • 确保安装了psutil:执行pip install psutil完成安装;
  • 如果机器人使用了多线程,需确保所有线程在重启前已正常退出,避免资源泄漏;
  • 测试时可以用ps aux(Linux)或任务管理器(Windows)检查进程数量,确认重启后原进程已被销毁。

内容的提问来源于stack exchange,提问作者Bram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:50:12