windows -- 自动安装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的包

  1. 源码包 sdist;
  2. 二进制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

报错:服务没有响应控制功能
当前服务无法启动,查看系统日志-搜索“事件查看器”
在这里插入图片描述
使用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)&&exit

start /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

猜你喜欢

转载自blog.csdn.net/weixin_45228198/article/details/131337658