寫一個Python的windows服務
阿新 • • 發佈:2018-08-31
start __main__ art ali sts sage lee manager vcs
1. 安裝pywin32和pyinstaller
pip install pywin32
pip install pyinstaller
2.寫一個服務Demo
# -*- coding: utf-8 -*- import sys import time import win32api import win32event import win32service import win32serviceutil import servicemanager import logging import inspect import os class MyService(win32serviceutil.ServiceFramework): _svc_name_ = "MyService" _svc_display_name_ = "My Service" _svc_description_ = "My Service" def __init__(self, args): win32serviceutil.ServiceFramework.__init__(self, args) self.stop_event = win32event.CreateEvent(None, 0, 0, None) self.logger = self._getLogger() def _getLogger(self): logger = logging.getLogger('[MyService]') this_file = inspect.getfile(inspect.currentframe()) dirpath = os.path.abspath(os.path.dirname(this_file)) handler = logging.FileHandler(os.path.join(dirpath, self._svc_name_ + ".log")) formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.INFO) return logger def SvcDoRun(self): self.ReportServiceStatus(win32service.SERVICE_START_PENDING) try: self.ReportServiceStatus(win32service.SERVICE_RUNNING) self.logger.info('start ...') self.start() self.logger.info('wait ...') win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE) self.logger.info('done!') except BaseException as e: self.logger.warn('Exception : %s' % e) self.SvcStop() def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) self.logger.info('stopping ...') self.stop() self.logger.info('stopped.') win32event.SetEvent(self.stop_event) self.ReportServiceStatus(win32service.SERVICE_STOPPED) def start(self): time.sleep(10000) def stop(self): pass def log(self, msg): servicemanager.LogInfoMsg(str(msg)) def sleep(self, minute): win32api.Sleep((minute * 1000), True) if __name__ == "__main__": if len(sys.argv) == 1: servicemanager.Initialize() servicemanager.PrepareToHostSingle(MyService) servicemanager.StartServiceCtrlDispatcher() else: win32serviceutil.HandleCommandLine(MyService)
3.凍結二進制
pyinstaller -F MyService.py --hidden-import=win32timezone
4.運行服務
dist\MyService.exe install
sc start MyService
寫一個Python的windows服務