Python3編寫Windows服務程序


最近做了公司簽到的小工具,有同事要求做成Windows服務,開機自啟。先說下怎么用Python寫Windows服務程序。

 1 #encoding=utf-8
 2 import win32serviceutil
 3 import win32service
 4 import win32event
 5 import win32timezone
 6 import os
 7 
 8 class PythonService(win32serviceutil.ServiceFramework):
 9     _svc_name_ = 'PythonService' #服務名稱
10     _svc_display_name_ = 'regMeal'
11     _svc_description_ = '每天晚上6:40后自動簽到'
12 
13 
14     def __init__(self,args):
15         win32serviceutil.ServiceFramework.__init__(self,args)
16         self.hWaitStop = win32event.CreateEvent(None,0,0,None)
17         self.logger = self._getLogger()
18         self.run = True
19 
20     def _getLogger(self):
21         import inspect
22         import logging
23         logger = logging.getLogger('[PythonService]')
24         this_file = inspect.getfile(inspect.currentframe())
25         dirpath = os.path.abspath(os.path.dirname(this_file))
26         handler = logging.FileHandler(os.path.join(dirpath,'service.log'))
27         formatter = logging.Formatter('%(asctime)s  %(name)-12s %(levelname)-8s %(message)s')
28         handler.setFormatter(formatter)
29         logger.addHandler(handler)
30         logger.setLevel(logging.INFO)
31         return logger
32 
33     def SvcDoRun(self):
34         import time
35         import readconfig
36         import regMeal
37         self.logger.info('service is run...')
38         while self.run:
39             self.logger.info('service is running...')
40             paraList = readconfig.readConfig()
41             bFlag = regMeal.main(paraList[0],paraList[1],paraList[2])
42             time.sleep(2)
43 
44     def SvcStop(self):
45         self.logger.info('service is stop.')
46         self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
47         win32event.SetEvent(self.hWaitStop)
48         self.run = False
49 
50 if __name__ == '__main__':
51     import sys
52     import servicemanager
53     if len(sys.argv) == 1:
54         try:
55             evtsrc_dll = os.path.abspath(servicemanager.__file__)
56             servicemanager.PrepareToHostSingle(PythonService)
57             servicemanager.Initialize('PythonService',evtsrc_dll)
58             servicemanager.StartServiceCtrlDispatcher()
59         except win32service.error as details:
60             import winerror
61             if details == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
62                 win32serviceutil.usage()
63     else:
64         win32serviceutil.HandleCommandLine(PythonService)

推薦大家對比網上其他的人的代碼對照看下。SvcDoRun這個函數里面放的就是你實際想做的事情。

安裝服務

python PythonService.py install

讓服務自動啟動

python PythonService.py --startup auto install 

啟動服務

python PythonService.py start

重啟服務

python PythonService.py restart

停止服務

python PythonService.py stop

刪除/卸載服務

python PythonService.py remove

我自己是用pyinstaller打包成exe給別人用的。

PS:腳本編好之后,調試了很久。剛開始會報服務無法啟動的問題。具體的排查方式可以看Windows事件查看。


免責聲明!

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



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