python 指令碼或者flask 註冊成為windows服務
阿新 • • 發佈:2021-12-10
分享下指令碼註冊成為win服務
這個借鑑了其他大佬得 具體是誰忘記了有機會推薦 今天也是找了之前得改出來得
首先安裝三個模組 最後一個是定時任務如果不需要可以不裝
pip install psutil
pip install pywin32
pip install apscheduler
下面貼程式碼
import os import sys import random import socket import time import psutil import servicemanager import win32con import win32event import win32process import win32security import win32service import win32serviceutil import win32timezone from apscheduler.schedulers.background import BackgroundScheduler sys.stdout = sys.stderr = open(os.devnull,'w') class SpiderService(win32serviceutil.ServiceFramework): # 註冊服務名 _svc_name_ = 'PS' # 服務在windows系統中顯示的名稱 _svc_display_name_ = 'Python Service' # 服務描述 _svc_description_ = 'Python Service Description' @classmethod def parse_command_line(cls): ''' ClassMethod 解析命令列 ''' win32serviceutil.HandleCommandLine(cls) def __init__(self, args): ''' winservice的建構函式 ''' self.scheduler = BackgroundScheduler() win32serviceutil.ServiceFramework.__init__(self, args) self.stop_event = win32event.CreateEvent(None, 0, 0, None) socket.setdefaulttimeout(60) def SvcStop(self): ''' 當服務被要求停止時呼叫 ''' self.stop() self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.stop_event) self.ReportServiceStatus(win32service.SERVICE_STOPPED) self.run = False def SvcDoRun(self): ''' 當服務被要求啟動時呼叫 ''' self.start() servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_, '')) try: username = 'admin' password = 'admin' domain = '' token = win32security.LogonUser( username, domain, password, win32con.LOGON32_LOGON_SERVICE, win32con.LOGON32_PROVIDER_DEFAULT ) win32security.ImpersonateLoggedOnUser(token) cmd = '<a command line programe>' cwd = '<a work dir>' env = os.environ priority = win32con.NORMAL_PRIORITY_CLASS startup = win32process.STARTUPINFO() (hProcess, hThread, dwProcessId, dwThreadId) = \ win32process.CreateProcessAsUser(token, None, cmd, None, None, True, priority, env, cwd, startup) process = psutil.Process(dwProcessId) return_code = process.wait() print('return code: %s' % str(return_code)) except win32security.error as e: print(e) self.main() win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE) #這個如果你是後臺啟動得flask 後臺服務要加上 while True: time.sleep(10) def __schedule(self): #新增定時任務 self.scheduler.add_job( self.ceshi, 'interval', seconds=10 ) #定時任務 def ceshi(self): while self.isrunning: random.seed() x = random.randint(1, 1000000) Path(f'c:\\{x}.txt').touch() time.sleep(5) def start(self): self.isrunning = True def stop(self): self.isrunning = False def main(self): self.__schedule() self.scheduler.start() if __name__ == '__main__': if len(sys.argv) == 1: try: event_src_dll = os.path.abspath(servicemanager.__file__) #這裡需要注意 他裡邊得引數要是你得類名SpiderService 下邊同樣得 servicemanager.PrepareToHostSingle(SpiderService) servicemanager.Initialize('SpiderService', event_src_dll) servicemanager.StartServiceCtrlDispatcher() except win32service.error as details: if details == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT: win32serviceutil.usage() else: win32serviceutil.HandleCommandLine(SpiderService)
命令 更多得可以搜一下 install 之後會安裝到服務裡邊但是並沒有開啟
python xxx.py install
python xxx.py start
python xxx.py stop
python xxx.py remove
打包 我這邊用得是pyinstaller
pyinstaller -F -w xxx.py
#打包完成後 命令是:(與之前得差不多)
xxx.exe install
xxx.exe start
...