2024年09月17日 16:18 阅读量:475
有http接口需要以windows服务运行提供服务,这里用python来实现。这里采用flask和pywin32实现。
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