文章目录
- 定制python的包
- 编写批处理文件
- 遇到的问题
自动安装python的包,并启动后台服务进程。
定制python的包
- 基于python的Flask框架,简单开发一个服务器;
- 编写发布python包的setup.py
在my_ff包的同级目录下创建一个setup.py
,实现如下内容:
# 打包发布python包
# 让别人可以通过pip进行安装import os
from setuptools import setup, find_namespace_packagesBASE_DIR = os.path.dirname(os.path.abspath(__file__))setup(name="myflask",version="1.0",author="laufing",description="simple flask server",# py_modules=["a", "b.c"], 发布的模块# packages=[],# 发布的包packages=find_namespace_packages(where=BASE_DIR,include=["my_ff", "my_ff.*"] # 当前包及其子包),# 包含包里的数据 如data.protoinclude_package_data=True,package_data={"": ["*.proto", "*.json"]}, # 所有 包下的目标文件,也可使用MANIFEST.in指定# 打包可执行脚本 在安装目录site-packages/bin中entry_points={"console_scripts": ["fserver = my_ff.run:main" # 脚本对应的函数,my_ff包需要能搜索到]},# 在site-packages等安装目录下生成bin目录,并加入scripts=["my_ff/run.py"],# include=[]# 限制python的版本python_requires=">=3.8",# 当前项目的安装依赖,自动从pypi安装install_requires=["flask<=1.2", "markupsafe<=2.0.1"],# setup的依赖setup_requires=[""]
)
发布python的包:
- 源码包 sdist;
- 二进制whl包 bdist_wheel
# 命令行执行,同级目录生成dist目录
python setup.py sdist bdist_wheel
编写批处理文件
- 编写bat批处理文件,将python包打包为whl二进制文件;
- 自动安装whl (默认安装到python环境的site-packages,也可指定目录);
- 将启动脚本加入系统服务【sc命令】;
rem 关闭回显
@echo offrem 打包whl
python setup.py bdist_wheelrem 进入dist目录安装
cd dist
dir | findstr .*\.whl > result.txt::获取whl对应的文件名,并使用pip安装
for /f "tokens=1,2,3,* delims= " %%i in (result.txt) do (
:: 代码块内部安装 target指定目录(可以自创建) upgrade覆盖式安装
pip install %%l --target=d:/lauf --upgrade
)
del /q result.txt:: 等待用户的输入
set /p lower=输入下位机ip:
set /p lowerPort=输入下位机端口:
echo 下位机地址:%lower%:%lowerPort%
set /p upper=输入上位机ip:
set /p upperPort=输入上位机端口:
echo 上位机地址:%upper%:%upperPort%:: 若当前d:/lauf d:/lauf/my_ff 不再PYTHONPATH中,则永久配置环境变量
set PYTHONPATH | findstr d:/lauf || setx PYTHONPATH "d:/lauf;d:/lauf/my_ff;%PYTHONPATH%"
:: 若d:/lauf/bin不在PATH中,则永久配置
set PATH | findstr d:/lauf/bin || setx PATH "d:/lauf/bin;%PATH%":: 将程序加入系统服务并启动
rem start fserver
rem 添加服务
sc create MyFlask binpath= D:/lauf/bin/fserver.exe start= auto displayname= MyFlask
::删除服务
:: sc delete LaufingFlask
pause
遇到的问题
添加系统服务失败,没有权限。
- 以
系统管理员
启动命令窗口,sc手动创建服务
或者修改注册表win+r - regedit - hkey_local_machine - software - microsoft - windows - currentversion - policies - system - EnableLUA - 0
# 添加服务
sc create ServerName binpath= xxx/xx.exe start= auto DisplayName= ServerName
# 启动服务
net start ServerName
报错:服务没有响应控制功能
当前服务无法启动,查看系统日志-搜索“事件查看器”
使用sc注册系统服务有一个缺点,就是exe程序必须符合系统服务规范,否则注册的服务无法启动。
目前使用sc注册的系统服务仍无法启动,后台进程使用如下方法实现。
- exe程序后台运行
dos命令下执行!!!-已验证ok
# 后台启动进程
start /b fserver.exe
但这种方式关闭命令窗口后,后台进程也会关闭。
改进:启动exe程序后,手动关闭其父进程conhost.exe
# 后台启动进程
start /b fserver.exe
# 杀掉其父进程 查看进程 tasklist | findstr conhost.exe
# /im 以名称杀掉进程;
# /pid 以进程id杀掉进程;
# /f 强制终止进程
taskkill /im conhost.exe /f
bat中实现后台进程:
server.bat
,用于bat中后台启动exe进程,必须单独形成bat文件。
@ECHO OFF%1 start mshta vbscript:createobject("wscript.shell").run("""%~0"" ::",0)(window.close)&&exitstart /b d:/lauf/bin/fserver.exe
deploy.bat
,完成部署操作并最后调用server.bat, 将server.bat中的代码放入deploy.bat中反而无效果。
@echo off
:: xxxx部署操作:: 调用server.bat,必须使用绝对路径
call d:/lauf/bin/server.bat