1. 程式人生 > 其它 >python 指令碼或者flask 註冊成為windows服務

python 指令碼或者flask 註冊成為windows服務

分享下指令碼註冊成為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
...