有http接口需要以windows服务运行提供服务,这里用python来实现。这里采用flask和pywin32实现。

应用场景

有http接口需要以windows服务运行提供服务,这里用python来实现。这里采用flask和pywin32实现。

pip安装依赖,命令行终端输入

pip install flask
pip install pywin32

代码参考

# -*- coding: utf-8 -*-

import win32serviceutil
import win32service
import win32event
import requests
import time
import os
import sys
import servicemanager

from flask import Flask
from flask import request
import random

# pip install requests
# pip install pywin32
# pip install flask

class rrbayServiceICP(win32serviceutil.ServiceFramework):
    _svc_name_ = 'rrbayServiceICP' ###可以根据自己喜好修改
    _svc_display_name_ = 'rrbay Service ICP'  ###可以根据自己喜好修改
    _svc_description_ = 'rrbay Service ICP'  ###可以根据自己喜好修改


    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.stop_event = win32event.CreateEvent(None, 0, 0, None)
        self.run = True

    def SvcDoRun(self):

        app = Flask(__name__)

        ######flask路由设置区,自定义功能也放在这里######

        #接口服务,比如传入一个url和一个参数,返回相应数据
        # http://127.0.0.1:8081/queryByCondition?domain=rrbay.com
        @app.route('/queryByCondition', methods=['GET'])
        def queryByCondition():
            info = request.args['domain']
            icpInfo = '298'
            if info:
                pass
            else:
                icpInfo = '299'
            return icpInfo

        #使用flask自带的web服务器,监听本地所有地址的8081端口

        ######自定义功能区结束######

        app.run(host='127.0.0.1', port=8081)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.stop_event)
        self.ReportServiceStatus(win32service.SERVICE_STOPPED)
        self.run = False

if __name__ == '__main__':

    if len(sys.argv) == 1:
        try:
            evtsrc_dll = os.path.abspath(servicemanager.__file__)
            servicemanager.PrepareToHostSingle(rrbayServiceICP) #如果修改过名字,名字要统一
            servicemanager.Initialize('rrbayServiceICP',evtsrc_dll) #如果修改过名字,名字要统一
            servicemanager.StartServiceCtrlDispatcher()
        except win32service.error as details:
            import winerror
            if details == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
                win32serviceutil.usage()
    else:
        win32serviceutil.HandleCommandLine(rrbayServiceICP) #如果修改过名字,名字要统一

打包exe

pyinstaller -F rrbayServiceICP.py

安装服务

rrbayServiceICP.exe install


标签:pywin32 flask win32serviceutil servicemanager