最新想通過python寫個windows服務 在系統后台處理一些事情,網上查了也寫資料,總體看差別不大,都是先pip install pywin32 這個模塊 ,然后新建一個類,寫代碼,這部分內容參考網上的帖子就可以,這里我要總結的地方是,在按照網上帖子寫好服務后 顯示碰到了 注冊服務不成功的問題,這個問題按照 博客園 的 三只松鼠 這位博主的總結內容解決了,但是注冊成功后,在start服務后 服務總是啟動不起來,在服務管理里 用手動也啟動不起來,后來 注意到在安裝服務命令執行后,控制台會給出相關提示
按照這個提示 我把我寫的服務py文件放在這個目錄 然后在這個目錄 運行cmd 再按照服務 啟動服務 都沒有問題了
我的代碼也一並列出來
1 import logging 2 import logging.handlers 3 import datetime 4 import time 5 6 import win32timezone 7 import win32serviceutil 8 import win32service 9 import win32event 10 11 12 class PythonService(win32serviceutil.ServiceFramework): 13 _svc_name_ = "PythonService" # 服務名稱 14 _svc_display_name_ = "Python_Service" # 在windows services上顯示的名字 15 _svc_description_ = "get codesys opcua values" # 通過opcua獲取codesys的數據 16 17 def __init__(self, args): 18 win32serviceutil.ServiceFramework.__init__(self, args) 19 self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) 20 self.logger = self._getLogger() 21 self.runFlag = True 22 23 def _getLogger(self): 24 logger = logging.getLogger('opc_log') 25 logger.setLevel(logging.DEBUG) 26 27 rf_handler = logging.handlers.TimedRotatingFileHandler('D:\opc_gpio.log', when='midnight', interval=1, 28 backupCount=7, atTime=datetime.time(0, 0, 0, 0)) 29 rf_handler.setFormatter(logging.Formatter("%(asctime)s--%(name)s--%(levelname)s--%(message)s")) 30 logger.addHandler(rf_handler) 31 return logger 32 33 def SvcDoRun(self): 34 import time 35 #self.ReportServiceStatus(win32service.SERVICE_START_PENDING) 36 self.logger.info("服務運行了") 37 try: 38 while self.runFlag: 39 self.logger.info("開始循環了") 40 time.sleep(10) 41 except Exception as e: 42 self.logger.info(e) 43 time.sleep(60) 44 45 def SvcStop(self): 46 self.logger.info("服務停止") 47 self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 48 win32event.SetEvent(self.hWaitStop) 49 self.runFlag = False 50 51 52 if __name__ == '__main__': 53 win32serviceutil.HandleCommandLine(PythonService)
我這里也抄一部分 三只松鼠 博主的內容 寫在這里 給自己做個提示,
3.然后將服務安裝到windows
管理員運行cmd,輸入如下命令:
#安裝服務 python Clearjob.py install #開啟服務 python Clearjob.py start #停止服務 python Clearjob.py stop #移除服務 python Clearjob.py remove
異常解決方法
1.開啟服務的時候會出現報錯“The service did not respond to the start or control request in a timely fashion”,意思是“服務沒有及時響應啟動或控制請求”。
2.解決方案:將Python36\Lib\site-packages\win32路徑下的pythonservice.exe注冊一下。
注冊命令:pythonservice.exe /register
3.這很尷尬。。。缺少pywintypes36.dll。找下,在Python36\Lib\site-packages\pywin32_system32路徑。
解決方法:設置到環境變量或者將此dll copy到Python36\Lib\site-packages\win32。
注冊完后執行python Clearjob.py start
服務運行成功!