简介

通常在windows平台上开发完python服务后,需要通过引用虚拟环境后再运行,或者使用IDE软件启动,但如果想做成开机启动的本地服务,每次都这样启动就太麻烦了。

该文档介绍这个方法是把python程序制作成一个windows,启停特别方便,而且还可以设置开机启动。虚拟环境依赖的库也不需要考虑,只要在构建的时候在虚拟环境下构建,就会自动将依赖的库打包进去。

1、首先,有一段大家通用的代码,可以将python程序制作成服务。直接拷贝使用即可,在SvcDoRun函数内写上拉起自己服务的代码。

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

import win32serviceutil

import win32service

import win32event

import sys

import os

#设置编码

reload(sys)

sys.setdefaultencoding('utf-8')

#windows服务中显示的名字

class zlsService(win32serviceutil.ServiceFramework):

_svc_name_ ='web_movie' ###可以根据自己喜好修改

_svc_display_name_ ='web_movie'  ###可以根据自己喜好修改

_svc_description_ ='web_movie'  ###可以根据自己喜好修改

def __init__(self,args):

win32serviceutil.ServiceFramework.__init__(self,args)

self.stop_event = win32event.CreateEvent(None,0,0,None)

self.run =True

def SvcDoRun(self):

# 这里是你的启动代码,由于我的是flask框架程序,只需要把我的主文件from过来即可。

from web_movieimport app

app.run()

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__':

import sys

import servicemanager

if len(sys.argv) ==1:

try:

evtsrc_dll = os.path.abspath(servicemanager.__file__)

servicemanager.PrepareToHostSingle(zlsService)#如果修改过名字,名字要统一

servicemanager.Initialize('zlsService',evtsrc_dll)#如果修改过名字,名字要统一

servicemanager.StartServiceCtrlDispatcher()

except win32service.erroras details:

import winerror

if details == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:

win32serviceutil.usage()

else:

win32serviceutil.HandleCommandLine(zlsService)#如果修改过名字,名字要统一

2、安装构建环境需要用的库,在虚拟环境内安装即可。

pip install PyInstaller==3.4

pip install pywin32==224

3、编写构建bat,其实就几个cmd命令,但是为了方便调试,我还是写成了一个脚本。

:: 停止运行的服务

sc stop web_movie

:: 删除这个服务

sc delete web_movie

:: 等个几秒钟,服务刚停止,文件不会马上释放,不然文件不让删除

TIMEOUT /T 3

:: 删除旧版本构建的内容

rmdir /s/q dist

rmdir /s/q build

del PythonService.spec

:: 构建现在的程序,这里有个坑,由于templates目录和static目录和代码不是直接引用,在pyinstaller构建的时候会忽略,导致服务无法运行,后面详细介绍。

pyinstaller -F --add-data "templates;templates" --add-data "static;static" PythonService.py

:: 将构建好的exe程序安装到系统服务

dist\PythonService.exe install

:: 启动服务

sc start web_movie

4、这时候在任务管理器里面就可以看到已经运行的服务了

5、如果不能启动,排查方法

如果启动后立即停止,或者弹窗说“服务没有及时响应启动或控制请求”,这时候可以查看windows的计算机管理界面应用日志,来看详细信息。

6、我遇到的坑

Traceback (most recent call last):

File "site-packages\win32\lib\win32serviceutil.py", line 839, in SvcRun

File "PythonService.py", line 28, in SvcDoRun

File "site-packages\flask\app.py", line 943, in run

File "site-packages\werkzeug\serving.py", line 812, in run_simple

File "site-packages\werkzeug\_reloader.py", line 267, in run_with_reloader

ValueError: signal only works in main thread

上面这个报错使我的代码出现过得,经过我的各种最小化测试,发现这个错误是加载配置项的时候就会出现,最终定位到了我的一行配置文件。

DEBUG =True,这一行配置让我排查了整整一天。

7、我遇到的坑

修复了上面的问题,我的的服务终于起来了,但是又发现,在浏览器里面竟然无法访问。如下提示:

Internal Server Error

The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

这个问题也让我苦恼了很久,在我最小化测试的时候,缩减到仅剩一个hello world都无法正常显示,但是创建一个新的flask项目就可以正常显示,经过我细心的diff这两个项目,

发现我在return的时候使用了render_template模板,然而这个目录在pyinstaller的时候,并没有打包进来,然后这一切都明白了,就是因为在构建的时候没有将这个目录添加进来,

导致项目启动后无法使用模板文件。

修复方法就是bat文件内写的,添加上静态目录的编译就可以了。

pyinstaller -F --add-data "templates;templates" --add-data "static;static" PythonService.py

python 做服务程序_windows平台把python程序制作成windows服务并开机启动(实践的坑)...相关推荐

  1. 用python做自我介绍_用python做个自我介绍(python入门教程)_逻辑教育

    原标题:用python做个自我介绍(python入门教程)_逻辑教育 本文涉及的python基础语法为:数据类型等 数字类型 1. 字符串的拼接 我们在上一章中已经简单介绍了一下字符串的创建方式,这里 ...

  2. 【Rust日报】2019-10-01 - Shawl: 一个能够将一切应用程序运行为Windows服务

    Shawl: 将一切应用程序运行为Windows服务 Shawl是一个用Rust编写的能够将任何程序作为Windows服务运行的包装程序.它可以处理Windows服务的API,因此您原本的程序只需要响 ...

  3. 将应用程序安装为Windows服务

    将应用程序安装为Windows服务 安装为服务的好处:不用登陆系统就可以自动启动. 微软官方对该小工具的说明: Installs and uninstalls executable services ...

  4. linux操作系统中业务程序及服务的开机启动

    linux操作系统中业务程序及服务的开机启动设置 1 背景 2 目标 3 启动类型 3.1 服务启动systemctl 3.2 服务启动chkconfig 3.2.1 查看服务 3.2.2 系统自带服 ...

  5. 使用instsrv.exe+srvany.exe将应用程序安装为windows服务

    一.什么是instsrv.exe和srvany.exe instsrv.exe.exe和srvany.exe是Microsoft Windows Resource Kits工具集中 的两个实用工具,这 ...

  6. 通过jsl工具将java程序注册为windows服务

    通过jsl工具将java程序注册为windows服务 首先下载jsl工具包,主要有jsl.exe可执行文件和jsl.ini配置信息文件 jsl 下载地址 在应用目录下新建以下几个路径 lib目录内容如 ...

  7. 使用wrapper将java程序注册程windows服务后不生效

    使用wrapper将java程序注册程windows服务后不生效 使用add.bat或test***.bat测试通过了, 然后使用install***.bat注册后cmd显示注册成功. 但是程序到了运 ...

  8. C#控制台程序注册成Windows服务

    在控制台程序中新增项目-->"Windows服务" 修改名称,我这里叫"Test_WindowsService" 然后在新增的"Windows服 ...

  9. 你到底可以用Python做什么?以下是Python的3个主要应用程序。

    导读:如果你想学Python,或者你刚开始学习Python,那么你可能会问:"我能用Python做什么?" 这个问题不好回答,因为Python有很多用途. 但是随着时间,我发现有P ...

最新文章

  1. 第三次AI寒冬即将来袭?
  2. 吉林大学数据结构(C++版)
  3. 【Java例题】4.1 级数求和1
  4. ts连接mysql数据库_各种数据库的连接方法
  5. mysql包1166_mysql 错误:1166 解决办法
  6. android 图片轮播
  7. 大龄程序员的未来在何方
  8. (23)npm项目发布
  9. JavaScript学习(十五)—内部样式与外部样式的修改与设置
  10. 前端同时访问后端同一接口两次,但只有后面那次请求有返回数据
  11. asp.net中用LinkButton取到gridview中当前行的ID值
  12. 【我拼搏的2016】为自己充电,发出耀眼的光
  13. 一文详解蒙特卡洛(Monte Carlo)法及其应用
  14. Map获取key值和value值
  15. 零点起算法44求最小值C语言,【算法链表面试题】面试问题:C语言实现“关… - 看准网...
  16. 蔡氏电路matlab仿真实代码验,基于蔡氏电路的MATLAB仿真
  17. 巴比特 | 元宇宙每日必读:3个月销售额近3个亿,虚拟偶像的“钱途”真的是一片光明吗?...
  18. redis安装+客户端
  19. 避免我们的邮件服务器发出的邮件被当成垃圾邮件
  20. java作业题exercise1

热门文章

  1. d630无电池升级bios_主板电池没电会怎样?手把手教你拆装主板电池
  2. mysql命令行导入dmp文件,oracle的备份文件(dmp)导入mysql数据库方法
  3. html前端开发作品,Web前端开发(HTML5+CSS3)
  4. 怎样检查c语言程序的问题,C语言陷阱与技巧第24节,做代码选择,不一定都要使用 if 判断的...
  5. javacore分析工具_线上死锁定位分析
  6. anaconda新建环境_机器学习实战-开发环境安装
  7. python协程详解_彻底搞懂python协程-第一篇(关键词1-4)
  8. python添加重复元素_在Python 3.6中添加迭代时重复元素
  9. 广义典型相关分析_数学建模/机器学习:广义加性模型(GAM)及其Python实现
  10. python-字典方法(dict)知识整理