博主遇到一个需求:每天都需要定时重启一个python脚本,这个脚本是跑在windows电脑上的,下面是博主的解决方法:
- 获取已经启动的应用的ID
- kill这个应用ID
- 再次根据指定的Python环境运行这个脚本
文章目录
- 解决步骤
- 1. 获取已经启动的应用ID
- 2. 根据应用ID,结束这个应用程序
- 3. 再次根据指定的Python环境运行这个脚本
 
- 完整示例
解决步骤
1. 获取已经启动的应用ID
博主的程序会监听到5001端口,因此根据这个特性,运行如下代码获取启动的应用ID:
import os
import subprocess
import time
from loguru import loggerdef exec_cmd(cmd):"""执行命令与结果"""r = os.popen(cmd)text = r.read()r.close()return textcmd = "netstat -aon|findstr 5001"
result = exec_cmd(cmd).strip()
得到如下结果:
TCP    0.0.0.0:5001           0.0.0.0:0              LISTENING       2404
可以看到,有一个TCP链接在监听5001端口,其中最后一个2404就是这个应用的ID
2. 根据应用ID,结束这个应用程序
_port = result.strip().split(' ')[-1]
exec_cmd(f"taskkill /T /F /PID {_port}")  # 成功关闭
3. 再次根据指定的Python环境运行这个脚本
subprocess.Popen(r"C:\Users\User4\Anaconda3\envs\my_env\python.exe main_run.py",cwd=r"C:\Users\User4\Desktop\my_python_bin")
logger.success("重启预测模型,延迟20s....")
这里用到了subprocess.Popen(),其中涉及到了2个目录和1个文件:
- 第一行C:\Users\User4\Anaconda3\envs\my_env\python.exe:这个是启动python的解释器完整路径(最好是完整路径)
- 第一行main_run.py:这个是需要重启的python脚本文件
- 第二行C:\Users\User4\Desktop\my_python_bin:这个是脚本所在的目录
以上程序可以理解为:
- 解释器:C:\Users\User4\Anaconda3\envs\my_env\python.exe
- 脚本目录:C:\Users\User4\Desktop\my_python_bin\main_run.py
完整示例
import os
import subprocess
import time
from loguru import loggerdef exec_cmd(cmd):"""执行命令与结果"""r = os.popen(cmd)text = r.read()r.close()return textdef restart_my_python():cmd = "netstat -aon|findstr 5001"result = exec_cmd(cmd).strip()if result != "":time.sleep(0.5)_port = result.strip().split(' ')[-1]exec_cmd(f"taskkill /T /F /PID {_port}")  # 成功关闭subprocess.Popen(r"C:\Users\User4\Anaconda3\envs\my_env\python.exe main_run.py",cwd=r"C:\Users\User4\Desktop\my_python_bin")logger.success("重启脚本,延迟5s....")time.sleep(5)restart_my_python()