文章目录
- 定制python的包
- 编写批处理文件
- 遇到的问题
自动安装python的包,并启动后台服务进程。
定制python的包
- 基于python的Flask框架,简单开发一个服务器;
- 编写发布python包的setup.py
在my_ff包的同级目录下创建一个setup.py
,实现如下内容:
# 打包发布python包
# 让别人可以通过pip进行安装
import os
from setuptools import setup, find_namespace_packages
BASE_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.proto
include_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 off
rem 打包whl
python setup.py bdist_wheel
rem 进入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
报错:服务没有响应控制功能
当前服务无法启动,查看系统日志-搜索“事件查看器”
- exe程序后台运行
dos命令下执行!!!
# 后台启动进程
start /b fserver.exe
但这种方式关闭命令窗口后,后台进程也会关闭。
改进:启动exe程序后,关闭其父进程conhost.exe
# 后台启动进程
start /b fserver.exe
# 杀掉其父进程 查看进程 tasklist | findstr conhost.exe
# /im 以名称杀掉进程;
# /pid 以进程id杀掉进程;
# /f 强制终止进程
taskkill /im conhost.exe /f