zoukankan      html  css  js  c++  java
  • Python 实现windows后台服务

    # -*- coding: utf-8 -*-
    import sys
    
    import win32api
    import win32con
    import win32event
    import win32service
    import win32serviceutil
    import servicemanager
    import logging
    import os
    from http.server import HTTPServer, CGIHTTPRequestHandler
    
    
    class HTTPFilerServer(win32serviceutil.ServiceFramework):
        _svc_name_ = "HTTPFileServer"
        _svc_display_name_ = "HTTP File Server"
        _svc_description_ = "HTTP File Server"
        _svc_data_dir = 'D:\ScreenRecorder'
    
        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('[HTTPFileServer]')
            dirpath = os.path.abspath(self._svc_data_dir)
            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('HTTP File Server is Starting ...')
                self.start()
                self.logger.info('HTTP File Server Started')
                import time
                time.sleep(3)
                os.chdir(self._svc_data_dir)
                httpd = HTTPServer(('', 8080), CGIHTTPRequestHandler)
                httpd.serve_forever()
    
                win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE)
                self.logger.info('HTTP File Server Shutdown')
            except BaseException as e:
                self.logger.warn('Exception : %s' % e)
                self.SvcStop()
    
        def SvcStop(self):
            self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
            self.logger.info('HTTP File Server is Stopping ...')
            self.stop()
            self.logger.info('HTTP File Server Service Stopped')
            win32event.SetEvent(self.stop_event)
            self.ReportServiceStatus(win32service.SERVICE_STOPPED)
    
        def start(self):
            if not os.path.exists(self._svc_data_dir):
                os.mkdir(self._svc_data_dir)
                win32api.SetFileAttributes(self._svc_data_dir, win32con.FILE_ATTRIBUTE_HIDDEN)
            else:
                pass
    
        def stop(self):
            pass
    
        def log(self, msg):
            servicemanager.LogInfoMsg(str(msg))
    
    
    if __name__ == "__main__":
        if len(sys.argv) == 1:
            servicemanager.Initialize()
            servicemanager.PrepareToHostSingle(HTTPFilerServer)
            servicemanager.StartServiceCtrlDispatcher()
        else:
            win32serviceutil.HandleCommandLine(HTTPFilerServer)
    
  • 相关阅读:
    Python全栈day28(描述符应用)
    Python全栈day28(上下文管理)
    如何在B2C电子商务网站后台添加CNZZ统计代码(转)
    数据统计以及商城运营日志在电子商务中的重要性(转)
    电商企业运营规划——五年经验总结(转)
    电子商务数据运营入门——有哪些数据分析需要做 (转)
    IDC单IP绑定多域名(包括端口)
    商城自动备份
    CentOS安装crontab及使用方法(转)
    CentOS中使用Shell脚本实现每天自动备份网站文件和数据库并上传到FTP中(转)
  • 原文地址:https://www.cnblogs.com/fangying7/p/9569120.html
Copyright © 2011-2022 走看看