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

