Windows自動化重啟python腳本的方法詳解
博主遇到一個需求:每天都需要定時重啟一個python腳本,這個腳本是跑在windows電腦上的,下面是博主的解決方法:
- 獲取已經(jīng)啟動的應用的ID
- kill這個應用ID
- 再次根據(jù)指定的Python環(huán)境運行這個腳本
解決步驟
1. 獲取已經(jīng)啟動的應用ID
博主的程序會監(jiān)聽到5001端口,因此根據(jù)這個特性,運行如下代碼獲取啟動的應用ID:
import os import subprocess import time from loguru import logger def exec_cmd(cmd): """執(zhí)行命令與結果""" 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鏈接在監(jiān)聽5001端口,其中最后一個2404就是這個應用的ID
2. 根據(jù)應用ID,結束這個應用程序
_port = result.strip().split(' ')[-1] exec_cmd(f"taskkill /T /F /PID {_port}") # 成功關閉
3. 再次根據(jù)指定的Python環(huán)境運行這個腳本
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): """執(zhí)行命令與結果""" 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腳本
為內(nèi)存問題或者其它blabla問題(總之不是代碼問題),程序可能會偶爾掛掉,我們又不能整天盯著程序,怎么辦呢?寫個腳本來檢查程序是否掛掉,如果掛掉就重啟,這是一個不錯的想法,具體做法依操作系統(tǒng)而不同。
方法1
在linux下可以新建一個名為run.sh的腳本:
#!/bin/sh while [ 1 ]; do python program.py --params done
在命令行中這樣啟動:
sh run.sh
其中program.py是要運行的python腳本,–params是參數(shù)。
在windows下可以類似地建個bat文件,由于bat不太熟,所以這部分就先空著。
方法2
在python中增加一些額外檢查異常的代碼,如果發(fā)生異常,就重新執(zhí)行,這里用的是遞歸的方法。下面的例子中,我設置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塊,可以捕獲可能導致腳本崩潰的異常,并在異常被捕獲后重新啟動腳本。具體實現(xiàn)如下:
import time import os import sys def main(): while True: try: # 主程序邏輯 print("腳本正在運行...") time.sleep(10) # 模擬長時間運行任務 except Exception as e: print(f"發(fā)生錯誤: {e}") print("腳本將在5秒后重啟...") time.sleep(5) os.execv(sys.executable, ['python'] + sys.argv) if __name__ == "__main__": main()
該腳本在異常發(fā)生時,會打印錯誤信息并在5秒后重啟自己。
到此這篇關于Windows自動化重啟python腳本的方法詳解的文章就介紹到這了,更多相關python腳本重啟內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python return語句如何實現(xiàn)結果返回調(diào)用
這篇文章主要介紹了Python return語句如何實現(xiàn)結果返回調(diào)用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10Python結合SpeechRecognition和gTTS庫打造智能語音備忘錄
這篇文章主要為大家詳細介紹了如何利用Python的SpeechRecognition和gTTS庫,打造一款集語音輸入,自動轉(zhuǎn)文字,朗讀保存于一體的智能語音備忘錄工具,感興趣的小伙伴可以了解下2025-04-04