博主遇到一个需求:每天都需要定时重启一个python脚本,这个脚本是跑在windows电脑上的,下面是博主的解决方法:
- 获取已经启动的应用的id
- kill这个应用id
- 再次根据指定的python环境运行这个脚本
解决步骤
1. 获取已经启动的应用id
博主的程序会监听到5001端口,因此根据这个特性,运行如下代码获取启动的应用id:
import os import subprocess import time from loguru import logger def exec_cmd(cmd): """执行命令与结果""" r = os.popen(cmd) text = r.read() r.close() return text cmd = "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 logger def exec_cmd(cmd): """执行命令与结果""" r = os.popen(cmd) text = r.read() r.close() return text def 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()
方法补充
1.自动重启挂掉的python脚本
为内存问题或者其它blabla问题(总之不是代码问题),程序可能会偶尔挂掉,我们又不能整天盯着程序,怎么办呢?写个脚本来检查程序是否挂掉,如果挂掉就重启,这是一个不错的想法,具体做法依操作系统而不同。
方法1
在linux下可以新建一个名为run.sh的脚本:
#!/bin/sh while [ 1 ]; do python program.py --params done
在命令行中这样启动:
sh run.sh
其中program.py是要运行的python脚本,–params是参数。
在windows下可以类似地建个bat文件,由于bat不太熟,所以这部分就先空着。
方法2
在python中增加一些额外检查异常的代码,如果发生异常,就重新执行,这里用的是递归的方法。下面的例子中,我设置count最大为3,为了避免无限递归下去。
import time count = 0 def compute_number(): for i in xrange(10): print 'count number: %s' % str(i+1) time.sleep(1) raise exception("a", "b") def main(): print "autores is starting" print "respawning" global count if count < 3: try: count += 1 compute_number() except exception, e: print e main() finally: print 'success' if __name__ == "__main__": main()
方法3
从这里 借鉴的做法:
#!/usr/bin/env python import os, sys, time def main(): print "autores is starting" executable = sys.executable args = sys.argv[:] args.insert(0, sys.executable) time.sleep(1) print "respawning" os.execvp(executable, args) if __name__ == "__main__": main()
2.python脚本如何自动重启
通过在python脚本中使用try-except块,可以捕获可能导致脚本崩溃的异常,并在异常被捕获后重新启动脚本。具体实现如下:
import time import os import sys def main(): while true: try: # 主程序逻辑 print("脚本正在运行...") time.sleep(10) # 模拟长时间运行任务 except exception as e: print(f"发生错误: {e}") print("脚本将在5秒后重启...") time.sleep(5) os.execv(sys.executable, ['python'] + sys.argv) if __name__ == "__main__": main()
该脚本在异常发生时,会打印错误信息并在5秒后重启自己。
到此这篇关于windows自动化重启python脚本的方法详解的文章就介绍到这了,更多相关python脚本重启内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论