Windows自动化重启python脚本的方法详解

Written by

in

文章目录
  • 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:UsersUser4Anaconda3envsmy_envpython.exe main_run.py”, cwd=r”C:UsersUser4Desktopmy_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脚本重启内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: 通过Python脚本+Jenkins实现项目重启 详解程序意外中断自动重启shell脚本(以Python为例) python实现程序重启和系统重启方式 python自动循环定时开关机(非重启)测试 python定时检测无响应进程并重启的实例代码 python实现自动重启本程序的方法
  • 目录
    • 解决步骤
      • 1. 获取已经启动的应用ID
      • 2. 根据应用ID,结束这个应用程序
      • 3. 再次根据指定的Python环境运行这个脚本
    • 完整示例
      • 方法补充

        博主遇到一个需求:每天都需要定时重启一个python脚本,这个脚本是跑在windows电脑上的,下面是博主的解决方法:

        • 获取已经启动的应用的ID
        • kill这个应用ID
        • 再次根据指定的Python环境运行这个脚本

        博主的程序会监听到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

        _port = result.strip().split(' ')[-1]
        exec_cmd(f"taskkill /T /F /PID {_port}")  # 成功关闭
        

        subprocess.Popen(r"C:UsersUser4Anaconda3envsmy_envpython.exe main_run.py",
                             cwd=r"C:UsersUser4Desktopmy_python_bin")
        logger.success("重启预测模型,延迟20s....")
        

        这里用到了subprocess.Popen(),其中涉及到了2个目录和1个文件:

        第一行C:UsersUser4Anaconda3envsmy_envpython.exe:这个是启动python的解释器完整路径(最好是完整路径)

        第一行main_run.py:这个是需要重启的python脚本文件

        第二行C:UsersUser4Desktopmy_python_bin:这个是脚本所在的目录

        以上程序可以理解为:

        解释器:C:UsersUser4Anaconda3envsmy_envpython.exe

        脚本目录:C:UsersUser4Desktopmy_python_binmain_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:UsersUser4Anaconda3envsmy_envpython.exe main_run.py",
        	                 cwd=r"C:UsersUser4Desktopmy_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脚本重启内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

        您可能感兴趣的文章:

        • 通过Python脚本+Jenkins实现项目重启
        • 详解程序意外中断自动重启shell脚本(以Python为例)
        • python实现程序重启和系统重启方式
        • python自动循环定时开关机(非重启)测试
        • python定时检测无响应进程并重启的实例代码
        • python实现自动重启本程序的方法

        站内搜索