利用python 建立windows服務的一點總結


最新想通過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

服務運行成功!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM