由于supervisor不支持windows,但要防止程序异常中断,所以需要采取措施

通过pywin32,使得flask以服务的方式运行

创建pythonservice.py

import win32serviceutil
import win32service
import win32event
from flask import Flask

class win32test(win32serviceutil.ServiceFramework):
_svc_name_ = "Flask Service"
_svc_display_name_ = "Flask Service"
_svc_description_ = "Flask App Service" def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) def SvcDoRun(self):
self.main()
win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
self.ReportServiceStatus(win32service.SERVICE_STOPPED) def main(self):
        app = Flask(__name__)
app.run(host="0.0.0.0",port=5000) if __name__ == '__main__':
win32serviceutil.HandleCommandLine(win32test)

安装服务:python flaskservice.py install

启动服务:python flaskservice.py start

停止服务:python flaskservice.py stop

删除服务:python flaskservice.py remove

出现的问题即解决过程:

flask不能以debug模式启动,必须关掉debug

问题:服务没有及时响应启动或控制请求

查了下,通过python flaskservice debug的方式,但错误信息是注册表问题,操作了半天的注册表,问题依然存在

之后查到NSSM也可以通过服务的方式运行,但报错信息还是一致,所以原因应该是一样的

通过查看windows日志解决问题

(参考:https://blog.csdn.net/ywg_1994/article/details/82430943)

之后看了下报错信息,提示可以查看windows日志,这下打开了新世界的大门

控制面板-系统和安全-管理工具-查看事件日志,等加载完毕,左侧选择windows日志-应用程序,这时观察右边,里面果然有Flask Service,点击查看错误信息

from jinja2 import escape 未找到模块jinja2

但明明是安装了的

pip show jinja2

显示位置为  c:\users\username\appdata\roaming\python\python36\site-packages

但python解释器明明是在c:\program files\python\python36\lib\site-packages

卸载重装模块,结果还是在用户目录下

有了日志就不怕了,出了问题都可以知道原因,解决即可

 

通过whl手动指定安装位置:

(但pip install --target=c:\program files\python\….. jinja2,显示files\…目录未找到,wtf)

最后通过下载whl文件,将文件放到目标目录,pip install xx.whl完成指定目录的模块安装

之后启动服务提示未找到markupsafe,同样下载whl进行安装

问题:提示服务开启后又被关闭

日志中:The instance's SvcRun() method failed <Error getting traceback - traceback.print_exception() failed %2: %3

(参考:https://stackoverflow.com/questions/52698395/windows-service-with-flask-only-run-in-debug-mode-normal-mode-seem-crash)

在pythonservice.py的最前面添加下面语句:

sys.stdout = sys.stderr = open(os.devnull, 'w')

然后重启服务,果然可以了;(原因不是很清楚,问题应该是无法输出错误信息,解决方案思路应该是给标准输出指定一个设备空文件)

之后在flask服务中设置:程序异常后-重新启动即可

也可以配合pyinstaller使用,更方便

在虚拟环境中也是可以的,操作与之前一样

python的服务主要是依赖于PythonService.exe和所写的服务文件(pythonservice.py)

保证这两个路径即可:

PythonService.exe的路径在服务中就可以查看

服务运行文件可以在服务的注册表中查看:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

如果安装上面直接不可以启动的话,参考:https://stackoverflow.com/questions/34696815/using-pythonservice-exe-to-host-python-service-while-using-virtualenv

其他:

python xxservice.py debug就是坑,最后已经可以启动服务了,执行还是报注册表未找到错误,wtf

中间还尝试了windows-supervisor,结果根本就不行

stackflow很完善,对于这些‘小众’的bug,都有相应的讨论及解决方案,很nice

流程:

python(环境变量配置,安装virtualenvwrapper,workon环境变量配置)

虚拟环境(安装模块的离线包)

安装服务,启动

最新文章

  1. NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
  2. 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递
  3. disconf系列【2】——解决zk部署情况为空的问题
  4. SVN代码的回滚二
  5. 自定义 密码是否可见 的EditView 右侧带个小眼睛
  6. Redis的Set操作
  7. Linux下用Intel编译器编译安装NetCDF-Fortan库(4.2以后版本)
  8. AJAX安全-Session做Token
  9. python学习第一课要点记录
  10. 【程序员小助手】Emacs,最强编辑器,没有之一
  11. Maven包装过程中跳过测试
  12. JQuery使用和选择器
  13. POPTEST老李分享修改dns ip的vbs代码
  14. 变态版大鱼吃小鱼-基于pixi.js 2D游戏引擎
  15. css是如何实现在页面文字不换行、自动换行、强制换行的
  16. Web API系列之三 基本功能实现
  17. 【easy】367. Valid Perfect Square 判断是不是平方数
  18. Python知乎热门话题数据的爬取实战
  19. Java数组实现循环队列的两种方法
  20. Remainders Game (中国剩余定理)

热门文章

  1. python第三次作业-mooc笔记
  2. vscode源码分析【七】主进程启动消息通信服务
  3. Selenium+java - 通过Robot对象上传文件
  4. pandas 学习 第1篇:pandas基础 - 数据结构和数据类型
  5. Redis for OPS 04:主从复制
  6. C#上手练习1(if语句、Swich语句)
  7. python基础(23):面向过程与面向对象的优劣、初识面向对象
  8. python基础(8):基本数据类型三(dict)、is和==、编码和解码
  9. length()返回当前字符串的字符个数
  10. MySqlBulkLoader 中文乱码