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)
        #&#x8FD9;&#x4E2A;&#x5982;&#x679C;&#x4F60;&#x662F;&#x540E;&#x53F0;&#x542F;&#x52A8;&#x5F97;flask &#x540E;&#x53F0;&#x670D;&#x52A1;&#x8981;&#x52A0;&#x4E0A;
        while True:
            time.sleep(10)

    def __schedule(self):
        #&#x6DFB;&#x52A0;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;
        self.scheduler.add_job(
            self.ceshi,
            'interval',
            seconds=10
        )
    #&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;
    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__)
            #&#x8FD9;&#x91CC;&#x9700;&#x8981;&#x6CE8;&#x610F;  &#x4ED6;&#x91CC;&#x8FB9;&#x5F97;&#x53C2;&#x6570;&#x8981;&#x662F;&#x4F60;&#x5F97;&#x7C7B;&#x540D;SpiderService &#x4E0B;&#x8FB9;&#x540C;&#x6837;&#x5F97;
            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)
</a></a>
命令 更多得可以搜一下 install 之后会安装到服务里边但是并没有开启
python xxx.py install
python xxx.py start
python xxx.py stop
python xxx.py remove
打包 我这边用得是pyinstaller
pyinstaller -F -w xxx.py
#&#x6253;&#x5305;&#x5B8C;&#x6210;&#x540E; &#x547D;&#x4EE4;&#x662F;&#xFF1A;&#xFF08;&#x4E0E;&#x4E4B;&#x524D;&#x5F97;&#x5DEE;&#x4E0D;&#x591A;&#xFF09;
xxx.exe install
xxx.exe start
...

Original: https://www.cnblogs.com/carl-/p/15671692.html
Author: Carl-
Title: python 脚本或者flask 注册成为windows服务

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/684738/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球