美文网首页
210729.python开发windows服务程序程序,并设置

210729.python开发windows服务程序程序,并设置

作者: 风往北吹_风往北吹 | 来源:发表于2021-10-12 17:13 被阅读0次

    python开发windows服务程序程序,并设置开机启动

    目前正在测试,还没有确定是否好用。

    环境设置

    python要开发windows程序,首先必须先安装好pywin32,还要安装pyinstaller。

    注意:使用pip install pywin32,因为某些众所周知的原因,确实安装不了。

    pip install pywin32 -i https://pypi.tuna.tsinghua.edu.cn/simple 
     
    pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    编写代码

    以下是通用的python编译成windows服务程序的模板

    #encoding=utf-8
    import win32serviceutil
    import win32service
    import win32event
    import os
    import logging
    import inspect
    class PySerTest(win32serviceutil.ServiceFramework):
        _svc_name_ = "PySerTest"
        _svc_display_name_ = "Py Service Test"#服务显示的名称,可以自己修改
        _svc_description_ = "This is a python service test code " #服务显示的描述
        def __init__(self, args):
            win32serviceutil.ServiceFramework.__init__(self, args)
            self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
            self.logger = self._getLogger()
            self.run = True
        def _getLogger(self):
            logger = logging.getLogger('[PythonService]')
            this_file = inspect.getfile(inspect.currentframe())
            dirpath = os.path.abspath(os.path.dirname(this_file))
            # handler = logging.FileHandler(os.path.join(dirpath, "service.log"))
            handler = logging.FileHandler("G:\\service.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):
            #在此编写自己的业务程序
            import time
            self.logger.info("service is run....")
            while self.run:
                self.logger.info("I am runing....")
                time.sleep(2)
     
        def SvcStop(self):
            self.logger.info("service is stop....")
            self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
            win32event.SetEvent(self.hWaitStop)
            self.ReportServiceStatus(win32service.SERVICE_STOPPED)
            self.run = False
    if __name__=='__main__':
        # win32serviceutil.HandleCommandLine(PythonService)
        import sys
        import servicemanager
        if len(sys.argv) == 1:
            try:
                evtsrc_dll = os.path.abspath(servicemanager.__file__)
                servicemanager.PrepareToHostSingle(PySerTest) #如果修改过名字,名字要统一
                servicemanager.Initialize('PySerTest',evtsrc_dll) #如果修改过名字,名字要统一
                servicemanager.StartServiceCtrlDispatcher()
            except win32service.error as details:
                import winerror
                if details == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
                    win32serviceutil.usage()
        else:
            win32serviceutil.HandleCommandLine(PySerTest) #如果修改过名字,名字要统一
    

    假如保存之后的文件名为winService.py,运行以下命令即可生成exe程序

    pyinstaller -F winService.py
    

    编译成功后,可通过以下命令对服务进行控制

    winService.exe install    //仅安装服务程序
    winService.exe --startup auto install //安装服务程序,并设置开机启动
    winService.exe start    //启动服务
    winService.exe stop     //停止服务
    winService.exe remove    //移除服务
    

    下面是我自己创建的服务程序,可在系统服务里看


    image.png

    ————————————————
    版权声明:本文为CSDN博主「zjw710」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/zjw710/article/details/104431079

    相关文章

      网友评论

          本文标题:210729.python开发windows服务程序程序,并设置

          本文链接:https://www.haomeiwen.com/subject/rylfvltx.html