windows -- 自动安装python包,并启动服务

文章目录

  • 定制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的包

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/701.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux -信号量semphore分析

linux -信号量分析 1 struct semaphore和sema_init1.1 struct semaphore1.2 sema_init 2 down3 up4 down_interruptible5 down_killable6 down_timeout7 down_trylock 基于linux-5.15分析&#xff0c;信号量在使用是是基于spin lock封装实现的。 1 struct semaphore和sema_ini…

壳牌小程序笔记

壳牌加油站 uni-app-基础-day01 概览 为什么要学uni-app&#xff1f; 现在很多中小型公司&#xff0c;都有自己的小程序项目&#xff0c;然后开发小程序就会用到uni-app。 uni-app没有诞生之前&#xff0c;怎么写小程序 使用原生微信小程序这个框架去开发&#xff1f; 只…

leetcode887. 鸡蛋掉落(动态规划-java)

鸡蛋掉落 leetcode887. 鸡蛋掉落题目描述暴力递归 二分查找代码演示 动态规划代码演示 动态规划专题 leetcode887. 鸡蛋掉落 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/super-egg-drop 题目描述 给你 k 枚相同的鸡…

助力工业物联网,工业大数据之其他维度:组织机构【十五】

文章目录 01&#xff1a;其他维度&#xff1a;组织机构02&#xff1a;其他维度&#xff1a;仓库、物流附录一&#xff1a;常见问题1.错误&#xff1a;没有开启Cross Join2.错误&#xff1a;Unable to move source 01&#xff1a;其他维度&#xff1a;组织机构 目标&#xff1a;…

Linux 设备驱动程序(四)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序&#xff08;一&#xff09; Linux 设备驱动程序&#xff08;二&#xff09; Linux 设备驱动程序&#xff08;三&#xff09; Linux 设备驱动程序&#xff08;四&#xff09; Linux设备驱动开发详解 …

IntelliJ IDEA如何自动生成serialVersionUID

IntelliJ IDEA如何自动生成serialVersionUID&#xff1f; 实体对象在流中传输时&#xff0c;需要将其序列化。 对象的类型实现Serializable接口public class ClassName implements java.io.Serializable { } 生成版本号serialVersionUID单击类名&#xff0c;按Alt Enter,在出…

【单目标优化算法】杂草优化算法(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

DragGAN开源:生成图像流形上的基于点的交互式操作

文旨在解决生成对抗网络&#xff08;GAN&#xff09;中控制生成图像的问题。通过“拖动”图像中的任意点&#xff0c;实现用户交互式精确控制生成图像的姿态、形状、表情和布局。 这个名叫DragGAN的模型&#xff0c;本质上是为各种GAN开发的一种交互式图像操作方法。论文以Sty…

软件外包开发在线监控工具

软件系统上线后需要实时监控&#xff0c;这样在系统出现问题后可以及时发现问题并解决问题。今天和大家分享常见的软件系统监控工具&#xff0c;这些工具功能强大且成熟稳定&#xff0c;熟练的应用可以帮助运维人员解决很多项目中的实际问题。北京木奇移动技术有限公司&#xf…

java面试高频面试题

文章目录 面向对象 什么是面向对象&#xff1f;封装继承多态 和equals比较hashCode与equals重载和重写的区别Final类加载器spring是什么AOP的理解谈谈你对IOC的理解零拷贝RocketMQ 架构设计RocketMq 事务消息原理RockeMq顺序消息消费原理简述RockerMQ持久化机制RocketMQ如何保…

Redis的简单使用 (实现Session持久化)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、Redis数据类型的使用 1. 字符串&#xff…

“前端已死”

一、一些迹象 逛社区&#xff0c;偶然看到了这张图片&#xff1a; 嗯……我眉头一皱&#xff0c;久久不语&#xff0c;心想&#xff0c;有这么夸张吗&#xff0c;假的吧&#xff1f; 突然想到&#xff0c;最近我在社区发了个前端招聘的信息&#xff0c;结果简历漫天纷飞&…