位置: IT常识 - 正文

【Web开发】Python实现Web服务器(Flask打包部署上线)(web开发 python)

发布时间:2024-01-17
【Web开发】Python实现Web服务器(Flask打包部署上线)

推荐整理分享【Web开发】Python实现Web服务器(Flask打包部署上线)(web开发 python),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python3 web开发,python开发web应用程序,python web开发教程,python进行web开发,python web开发从入门到精通,python web开发从入门到精通,python web开发基础教程,web开发 python,内容如对您有帮助,希望把文章链接给更多的朋友!

🍺基于Python的Web服务器系列相关文章编写如下🍺:

🎈【Web开发】Python实现Web服务器(Flask快速入门)🎈🎈【Web开发】Python实现Web服务器(Flask案例测试)🎈🎈【Web开发】Python实现Web服务器(Flask部署上线)🎈🎈【Web开发】Python实现Web服务器(Tornado入门)🎈🎈【Web开发】Python实现Web服务器(Tornado+flask+nginx)🎈🎈【Web开发】Python实现Web服务器(FastAPI)🎈🎈【Web开发】Python实现Web服务器(Bottle)🎈🎈【Web开发】Python实现Web服务器(Django)🎈🎈【Web开发】Python实现Web服务器(web2py)🎈🎈【Web开发】Python实现Web服务器(Sanic)🎈文章目录1、简介2、虚拟环境virtualenv2.1 virtualenv2.2 virtualenvwrapper3、更换WSGI容器3.1 waitress3.2 gevent3.3 Gunicorn3.4 uWsgi3.5 Twisted Web3.6 Tornado+nginx3.7 apache+mod_wsgi4、打包工具PyInstaller4.1 requirements.txt4.2 安装4.3 参数4.4 示例5、注册Windows服务5.1 pyinstaller + nssm5.2 pywin326、whl文件制作6.1 安装6.2 示例结语

1、简介

Web 程序通常有两种部署方式:传统部署和云部署。传统部署指的是在使用物理主机或虚拟主机上部署程序,你通常需要在一个 Linux 系统上完成所有的部署操作;云部署则是使用其他公司提供的云平台,这些平台为你设置好了底层服务,包括 Web 服务器、数据库等等,你只需要上传代码并进行一些简单设置即可完成部署。

2、虚拟环境virtualenv2.1 virtualenv安装virtualenv:pip install virtualenv

创建一个虚拟环境,暂且取名为 new_env:

virtualenv new_env

在 Windows 系统上面使用 virtualenv: 首先进入到虚拟环境目录中的 Scripts 目录:

cd new_env\Scriptsactivate

在 Linux 上使用 virtualenv Linux 上面进入虚拟环境的方式跟 Windows 稍微有点不同,可以直接使用命令来进入,比如同样在 Linux 上面的 envs 文件夹下面有个 new_env 虚拟环境,则直接输入以下命令就可以进入虚拟环境:

source new_env/bin/activate

进入了虚拟环境之后,Windows 和 Linux 上面的操作都是一样的,这里就不单独去说明了。

2.2 virtualenvwrapper

virtualenvwrapper 是一个 virtualenv 虚拟环境的管理库,这个库可以更加方便的管理所有的虚拟环境,由于在 Windows 和 Linux 上面这个库的安装和配置不同,所以要单独做说明。

Windows 上安装virtualenvwrapper环境 Windows 上需要安装的是virtualenvwrapper-win,直接使用pip命令就可以了:pip install virtualenvwrapper-win

配置虚拟环境的保存路径。首先需要在想要统一存放虚拟环境的地方创建一个文件夹(我在F盘建立了D:\test_env),然后把这个文件夹添加到系统的环境变量中。如果不设置系统环境变量,那么创建的虚拟环境会保存到默认的地方,不方便管理.

Linux 上安装virtualenvwrapper环境pip3 install virtualenvwrapper

配置环境变量文件。首先修改(文件不存在就创建)文件~/.bashrc,然后添加如下语句:

export WORKON_HOME=$HOME/.virtualenvsexport PROJECT_HOME=$HOME/workspacesource /usr/local/bin/virtualenvwrapper.sh

然后运行:

source ~/.bashrcwhich python3virtualenvwrapper 命令:创建虚拟环境:mkvirtualenv new_env使用虚拟环境:workon new_env退出虚拟环境:deactivate删除虚拟环境: rmvirtualenv new_env查看所有虚拟环境:lsvirtualenv在使用命令workon任意目录使用虚拟环境 先使用workon查看所有的虚拟环境 在workon 名称 切入该虚拟环境mkvirtualenv flask_envworkonworkon flask_envpip install -r requirements.txtdeactivate#生成文件pip freeze >F:A_FILE\requirements.txt#复制环境pip install -r requirements.txt3、更换WSGI容器 WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

虽然 Flask 提供了内置 Web 服务器,但是那种服务器是为开发打造的,达不到生产环境中需要的安全和效率,细心的同学会注意到,用 app.run() 或者 flask run 启动应用时,都会得到一句警告:Do not use the development server in a production environment.

那么在生产环境中,需要用生产专用 Web 服务器,比如 uWSGI、Gunicorn、Gevent 等等。 独立的WSGI容器:有很多流行的服务器用Python编写,它们包含WSGI应用程序并提供HTTP服务。 Web框架(Flask)和Web服务器(Nginx)之间的通信,需要一套双方都遵守的接口协议。而WSGI协议就是用来统一这两者的接口的(WSGI是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口)

3.1 waitress

安装waitress Flask服务本身并不支持并发测试,本身的TPS很低,所以需要利用其他工具来支持并发测试。 waitress是Windows下基于python的一个框架,可以提高Flask的TPS。

waitress支持windows环境

Waitress是一个具备生产级品质并有高性能的纯python编写独立的WSGI服务器,它只依赖python标准库,不依赖任何第三方库。 同时它可以在多平台下运行,比如windows、linux、unix等,支持http/1.0和http/1.1。

pip install waitress

from waitress import servefrom flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world(): return 'Hello World,爱看书的小沐!'if __name__ == '__main__': # app.run() # app.run(host="127.0.0.1", port="8080") # app.run(host='localhost', port=8080, threaded=False, processes=1) serve(app, host='0.0.0.0', port=8080)waitress-serve --call 'flaskr:create_app'## Serving on http://0.0.0.0:80803.2 gevent

https://pypi.org/project/gevent/ http://www.gevent.org/ https://github.com/gevent/gevent

gevent is a coroutine -based Python networking library that uses greenlet to provide a high-level synchronous API on top of the libev or libuv event loop.

安装gevent: flask直接用于生产环境无论是处理高并发还是鲁棒性都有所欠缺,一般会配合WGSI容器来进行生产环境的部署。WSGI主要规定了Web服务器如何与Web应用程序进行通信,以及如何将Web应用程序链接在一起来处理一个请求。

gevent支持windows环境

gevent是一个基于 libev的并发库。它为各种并发和网络相关的任务提供了整洁的API。 gevent:基于 libev 与 Greenlet 实现。不同于 Eventlet 的用 python 实现的 hub 调度,gevent通过 Cython 调用 libev 来实现一个高效的 event loop 调度循环。同时类似于 Event,gevent也有自己的 monkey_patch,在打了补丁后,完全可以使用 python 线程的方式来无感知的使用协程,减少了开发成本。

pip install geventfrom gevent.pywsgi import WSGIServerfrom flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world(): return 'Hello World,爱看书的小沐!'if __name__ == '__main__': # app.run() # app.run(host="127.0.0.1", port="8080") # app.run(host='localhost', port=8080, threaded=False, processes=1) # serve(app, host='127.0.0.1', port=80, threads=1) # serve(app, host='0.0.0.0', port=8080) WSGIServer(('127.0.0.1', 8080), app).serve_forever()

引入gevent WSGI Server ,这里需要开启猴子补丁。而且需要注意 把gevent 猴子补丁 有关gevent的引入放在导入其他库的前面。

# geventfrom gevent import monkeyfrom gevent.pywsgi import WSGIServer# 有人说添加了如下这一句就不阻塞请求monkey.patch_all()# gevent endfrom flask import Flaskapp = Flask(__name__)@app.route('/')def index(): # 测试阻塞url1时,url2是否能够访问 time.sleep(3000) return 'Hello World1'@app.route('/hello')def hello(): return 'Hello World2'if __name__ == '__main__': # app.run(port=5000,host="127.0.0.1") http_server = WSGIServer(('127.0.0.1', int(5000)), app) http_server.serve_forever()3.3 Gunicorn

https://gunicorn.org https://github.com/benoitc/gunicorn

Gunicorn ‘Green Unicorn’ is a Python WSGI HTTP Server for UNIX. It’s a pre-fork worker model. The Gunicorn server is broadly compatible with various web frameworks, simply implemented, light on server resources, and fairly speedy.

Gunicorn和uWSGI是常用的WSGI容器,Gunicorn直接用命令启动,不需要编写配置文件,相对uWSGI要容易很多。

Gunicorn ‘Green Unicorn’ 是一个 UNIX 下的 WSGI HTTP 服务器,它是一个 移植自 Ruby 的 Unicorn 项目的 pre-fork worker 模型。它既支持 eventlet , 也支持 greenlet.

Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。 和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。

Gunicorn 是一个 Python 的 WSGI HTTP 服务器。它所在的位置通常是在反向代理(如 Nginx)或者 负载均衡(如 AWS ELB)和一个 web 应用(比如 Django 或者 Flask)之间。

目前Gunicorn只能运行在Linux环境中,不支持windows平台。

pip install flaskpip install gunicornpip show gunicorn#创建软连接哦ln /usr/local/python3.7/bin/gunicorn /usr/bin/gunicorn# 在hello.py所在的目录下# -w 设置进程数# -b 设置端口# 默认使用的是8000 可以通过-b 127.0.0.1:5000 设置到5000或其他端口gunicorn -w 4 hello:appgunicorn -w 5 --threads=2 main:appgunicorn -w 5 --thread=2 --worker-class=gthread main:appgunicorn --worker-class=gevent --worker-connections=1000 -w 3 main:appgunicorn -w 4 demo:app --worker-class syncgunicorn -w 4 demo:app -k sync##第一种并发方式(workers 模式,又名 UNIX 进程模式)#每个 worker 都是一个加载 Python 应用程序的 UNIX 进程。worker 之间没有共享内存。#建议的 workers 数量是 (2*CPU)+1。#对于一个双核(两个CPU)机器,5 就是建议的 worker 数量。gunicorn --workers=5 main:app##第二种并发方式(多线程)#Gunicorn 还允许每个 worker 拥有多个线程。在这种场景下,Python 应用程序每个 worker 都会加载一次,同一个 worker 生成的每个线程共享相同的内存空间。gunicorn --workers=5 --threads=2 main:apporgunicorn --workers=5 --threads=2 --worker-class=gthread main:app#使用四核(4 个 CPU)机器并且我们想使用 workers 和多线程模式,我们可以使用 3 个 worker 和 3 个线程来得到最大为 9 的并发请求数量。gunicorn --workers=3 --threads=3 main:app##第三种并发方式(“伪线程”)#有一些 Python 库比如(gevent 和 Asyncio)可以在 Python 中启用多并发。那是基于协程实现的“伪线程”。Gunicrn 允许通过设置对应的 worker 类来使用这些异步 Python 库。#(2*CPU)+1 仍然是建议的workers 数量。因为我们仅有一核,我们将会使用 3 个worker。#在这种情况下,最大的并发请求数量是 3000。(3 个 worker * 1000 个连接/worker)gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 main:app

并发是指同时执行 2 个或更多任务,这可能意味着其中只有一个正在处理,而其他的处于暂停状态。 并行是指两个或多个任务正在同时执行。 在 Python 中,线程和伪线程都是并发的一种方式,但并不是并行的。但是 workers 是一系列基于并发或者并行的方式。

gunicorn + flask 简单示例

mytest.py:from flask import Flaskapp = Flask(__name__)@app.route('/demo', methods=['GET'])def demo(): return "This is a gunicorn and flask demo."gunicorn mytest:app#orgunicorn --workers=2 mytest:app#orgunicorn --workers=4 --bind=127.0.0.1:8000 mytest:app3.4 uWsgi

uWSGI 也是部署 Flask 的途径之一,类似的部署途径还有 nginx 、 lighttpd 和 cherokee 。其他部署途径的信息参见 FastCGI 和 独立 WSGI 容器 。 使用 uWSGI 协议来部署 WSGI 应用的先决条件是需要一个 uWSGI 服务器。 uWSGI 既是一个协议也是一个服务器。如果作为一个服务器,它可以服务于 uWSGI 、 FastCGI 和 HTTP 协议。

uWSGI是一个全功能的HTTP服务器,实现了WSGI协议、uwsgi协议、http协议等。它要做的就是把HTTP协议转化成语言支持的网络协议。比如把HTTP协议转化成WSGI协议,让Python可以直接使用。

最流行的 uWSGI 服务器是 uwsgi。

有网友说Windows 10安装uWSGI不可行,不要浪费时间。

pip install uwsgi启动:uwsgi --ini uwsgi.ini重启:uwsgi --reload uwsgi.pid停止:uwsgi --stop uwsgi.piduwsgi --versionuwsgi --python-versioinuwsgi --http :9090 --wsgi-file run.py# --http: 通过 http 可访问,绑定端口为 9090# --wsgi-file:指定启动脚本#创建的文件名是 start.ini[uwsgi]#uwsgi启动时,所使用的地址和端口(这个是http协议的)http=0.0.0.0:8000#指向网站目录chdir=/Users/myProjects/test001#python 启动程序文件wsgi-file=app.py#python 程序内用以启动的application 变量名callable=app#处理器数processes=4#线程数threads=2#直接命令行启动项目uwsgi --ini start.ini#如果你执行了 ctrl + c 命令退出了命令行,会发现我们的项目访问不到了,因为你退出了前台运行的 uwsgi 命令。#想要退出当前命令行,去执行其他命令,而 flask 应用可以正常访问,只需要多加一个参数 -d 即可,如下:uwsgi -d --ini start.ini#mac、Linux下首先查看 uwsgi 的进行号ps -ef|grep uwsgi3.5 Twisted Web

Twisted Web 是一个 Twisted 自带的网络服务器,是一个成熟的、异步的、 事件驱动的网络库。 Twisted Web 带有一个标准的 WSGI 容器,该容器可以使用 twistd 工具运行命令行来控制。 Twisted Web支持windows环境部署

pip install -i https://pypi.douban.com/simple/ twistedflask_web.py:from flask import Flaskapp = Flask(__name__)@app.route('/')def index(): return 'Hello World'if __name__ == '__main__': app.run()

通过命令行执行:

twistd -n web --wsgi flask_web.app

或者通过bat文件执行:

flask_run.batset PYTHONPATH=.;venv/Lib;venv/Lib/site-packagesset PATH=%PATH%;venv/Scriptstwistd -n web --port tcp:8080 --wsgi run.app3.6 Tornado+nginx

【Web开发】Python实现Web服务器(Tornado+flask+nginx) https://blog.csdn.net/hhy321/article/details/125233806 Tornado+nginx支持windows环境部署

3.7 apache+mod_wsgi

首先需要安装apache和mod_wsgi,需要注意的是python版本,apache版本,mod_wsgi版本要匹配,不然会出问题。 apache+mod_wsgi支持windows环境部署

【Web开发】Python实现Web服务器(Flask打包部署上线)(web开发 python)

Apache下载网址:https://www.apachelounge.com/download/VC10/ https://www.apachehaus.com/downloads/httpd-2.4.54-o111s-x64-vs17.zip https://www.apachelounge.com/download/VC10/binaries/httpd-2.4.23-win64.zip mod-wsgi下载网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi 将下载好的httpd和mod-wsgi压缩包解压,然后将mod-wsgi的pyd文件放在httpd的modules文件夹里,如下图所示。

新建测试项目文件夹test,在里面新建test_flask.py。

test_flask.pyimport jsonfrom flask import Flask, request, jsonify,render_templateapp = Flask(__name__)tasks = [ { 'id': 1, 'title': u'订阅 a 专栏', 'description': u'专栏Link: https://www.a.com' }, { 'id': 2, 'title': u'订阅 b 专栏', 'description': u'专栏Link: https://www.b.com' }]@app.route('/test')def hello_world(): return 'Hello World,爱看书的小沐!'@app.route("/")def index(): # return render_template("index.html") return jsonify({'tasks': 200})@app.route('/api/v1.0/tasks', methods=['GET'])def get_tasks(): return jsonify({'tasks': tasks})@app.route('/getdata')def get_data(): language = ['python', 'java', 'c', 'c++', 'c#', 'php'] value = ['100', '150', '100', '90', '80', '90'] return json.dumps({'language':language,'value':value},ensure_ascii=False) if __name__ == '__main__': app.run(host="0.0.0.0", port=8080)

在项目文件夹test里,新建文件myapp.wsgi

myapp.wsgi

修改apache httpd的相关参数设置。 httpd.conf文件增加一行:

LoadModule wsgi_module modules/mod_wsgi.cp38-win_amd64.pyd

修改一下httpd.conf的第40行的SRVROOT的参数,不修改的话,运行可能报错:

httpd.conf文件的最后面增加一段代码如下:

<VirtualHost *:80> ServerAdmin "127.0.0.1" ServerName localhost:80 DocumentRoot D:\0627\test <Directory D:\0627\test> Require all granted </Directory> WSGIScriptAlias / D:\0627\test\myapp.wsgi </VirtualHost>

然后执行Apache24\bin\httpd.exe,开启web服务。 最后浏览器访问:

http://127.0.0.1

http://127.0.0.1/test

http://127.0.0.1/getdata

如果出错去apache24的logs文件夹的error.log文件去看输出了什么错。

4、打包工具PyInstaller

https://pypi.org/project/pyinstaller/ https://pyinstaller.org/en/stable/

4.1 requirements.txt

pip 提供了导出依赖模块名录的功能,可以一并导出依赖名录: • 将环境中依赖的外部模块名录导入到 requirements.txt 中

pip freeze > requirements.txt

由于 pip freeze 与 pip list 内容区别不大,所以,若想要用其作为工程依赖包列表,一定要配合 Python 虚拟环境 virtualenv 使用。 • 在服务器上依据 requirements.txt 安装应用依赖

pip install -r requirements.txt

我们要将 requirements.txt 作为项目代码的一部分。

4.2 安装

Python 默认并不包含 PyInstaller 模块,因此需要自行安装 PyInstaller 模块。 安装 PyInstaller 模块与安装其他 Python 模块一样,使用 pip 命令安装即可。

pip install pyinstaller4.3 参数

常用参数如下: -F:打包 Python 程序为单个可执行文件 -D:打包 Python 程序为一个文件夹 -i:生成图标,只适用于 Windows 平台 -n:指定打包后生成文件的名称 -w:表示去掉控制台窗口,这在GUI界面时非常有用。 –add-data: 表示添加资源文件,参数为 “源地址;目标地址”

-h–help查看该模块的帮助信息-F-onefile产生单个的可执行文件-D–onedir产生一个目录(包含多个文件)作为可执行程序-a–ascii不包含 Unicode 字符集支持-d–debug产生 debug 版本的可执行文件-w–windowed,–noconsolc指定程序运行时不显示命令行窗口(仅对 Windows 有效)-c–nowindowed,–console指定使用命令行窗口运行程序(仅对 Windows 有效)-o DIR–out=DIR指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件-p DIR–path=DIR设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径-n NAME–name=NAME指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字参数参数意义-F --onefile1.打包单个文件,产生一个文件用于部署(默认),如果代码都写在一个.py文件时使用,项目有多个文件时不要使用。例:pyinstaller -F xxx.py,例:pyinstaller --onefile xxxx.py-D --onedir1.打包多个文件,产生一个目录用于部署(默认),用于框架编写的代码打包。例:pyinstaller -D xxx.py(项目入口文件),例:pyinstaller --onedir xxx.py(项目入口文件)–key=keys1.使用keys进行加密打包。例:pyinstaller --key=1234 -F xx.py-K --tk1.在部署时包含 TCL/TK-a --ascii1.不包含编码.在支持Unicode的python版本上默认包含所有的编码-d --debug1.产生debug版本的可执行文件-n name --name=name1.可选的项目(产生的spec的)名字name。2.第一个脚本的主文件名将作为spec的名字(默认)。例:pyinstaller -F -n my_file_name xxx.py。例:pyinstaller -F --name=my_file_name xxx.py-o dir – out=dir1.指定spec文件的生成目录dir。2.如果没有指定且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录。3.如果没有指定切当前目录不是PyInstaller的根目录,则会输出到当前的目录下-p dir --path=dir1.用来添加程序所用到的包的所在位置,设置导入路径(和使用pythonpath效果相似)。2.可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径,让Pyintaller自己去找程序需要的资源。-w --windowed --noconsole1.表示去掉控制台窗口,使用Windows子系统执行,当程序启动的时候不会打开命令行(只对Windows有效)。例:pyinstaller -c xxx.py。例:pyinstaller xxx.py --noconsole-c --nowindowed --console1.表示打开控制台窗口,使用控制台子系统执行,当程序启动的时候会打开命令行(默认)(只对Windows有效)。例:pyinstaller -c xxx.py。例:pyinstaller xxx.py --console-i --icon=<file.ioc>1.将file.ico添加为可执行文件的资源,改变程序的图标(只对Windows系统有效)。例:pyinstaller -F -i file.ico xxx.py。例:pyinstall -F --icon=<file.ioc> xxx.py --icon=<file.exe,n> 1.将file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效)-v file --version=file1.将verfile作为可执行文件的版本资源(只对Windows系统有效)-s --strip1.可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用-X --upx1.如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note)4.4 示例pyinstaller your_program.pypyinstaller --add-data 'src/README.txt:.' myscript.pyPyinstaller -F -w main.pypyinstaller -F -w --add-data="xxxx.gif;." myapp.pypyinstaller -F xxx.spec#pyinstaller x.py --add-data="源地址;目标地址"。 windows以;分割,linux以:分割#将 config 目录的所有文件打包到目标的 config 文件夹(不存在会自动创建)下pyinstaller x.py --add-data ".\\config\\*;.\\config"#可使用多次 --add-datapyinstaller x.py -n Demo2.0.3 --key !@)v -i "res\logo.ico" --add-data=".\*.txt;." --add-data=".\*.json;." --add-data="res\*.*;.\res" --add-data="dist\models\*.*;.\models"打包单个文件# 1.执行命令pyinstaller -F xxx.py# 2.去生成的dist文件夹找xxx.exe运行# 3.运行成功,xxx.exe则为可执行文件,删除其它文件打包多个文件# 1.执行命令,xxx.py为程序入口文件pyinstall -D xxx.py # 2.删除生成的bulid和dist文件夹,仅保留xxx.spec文件# 3.修改xxx.spec文件,详见2.2.1# 4.执行命令pyinstaller -F xxx.spec# 5.去dist文件夹下找xxx.exe文件# 6.运行成功,删除临时文件目录build;dist目录为打包的结果,可执行文件和其它程序运行的关联文件都在这个目录下

注意事项: (1)文件打包后过大?在程序中尽量不使用import xx;而是使用 from xx import xx。 (2)编辑.spec文件路径相关。windows尽量使用绝对路径,用双斜杠\。linux路径/home/my_project/web。路径避免使用中文。 (3)打包错误:ModuleNotFoundError: No module named ‘xxx’ 方法1:pyinstaller -D --hidden-import=“xxx” main.py 方法2:在myapp.spec中配置hiddenimports=[‘xxx’] (4)打包.spec文件报错:RecursionError: maximum recursion depth exceeded 在spec文件上添加递归深度的设置 import sys sys.setrecursionlimit(5000)

利用*.spec 打包文件配置来实现多文件打包

# -*- mode: python ; coding: utf-8 -*-block_cipher = None# 可以将需要的文件夹,资源这样添加进包里# 资源文件、代码需要打包一起的added_files = [ ('d:/demo/Libs', 'Libs' ), ('d:/demo/Script', 'Script' ) ]#Analysis为主入口文件a = Analysis(['main.py'],#他的路径 pathex=['d:\\demo'], binaries=[], datas=added_files, hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False)pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], # 打包程序的名字 name='your_exe_name', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True,#图标的地址icon='your.ico' )# -*- mode: python ; coding: utf-8 -*-block_cipher = pyi_crypto.PyiBlockCipher(key='!@)v')a = Analysis(['x.py'], pathex=['D:\\Miniconda3\\envs\\cuda11\\Lib\\site-packages', 'D:\\project\\demo'], binaries=[], datas=[('.\\*.json', '.'), ('res\\*.*', '.\\res'), ('dist\\models\\*.*', '.\\models')], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False)pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)exe = EXE(pyz, a.scripts, [], exclude_binaries=True, name='Demo2.0.3', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=False , icon='res\\logo.ico')coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='Demo2.0.3')5、注册Windows服务5.1 pyinstaller + nssm(1)安装相关库# 安装flask库pip install flask# 安装pyinstaller库pip install pyinstaller# orpip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller(2)编写相关web逻辑

myapp.py:

#!/usr/bin/env python3# -*- coding: utf-8 -*-from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/')def hello_world(): return 'Hello World,爱看书的小沐!'@app.route('/modelstatus', methods=['GET', 'POST'])def train_status(): if request.method == 'GET': return jsonify({'code': 200, 'status': 'false', 'msg': 'hello'}) else: return jsonify({'code': 500, 'msg': '不支持该请求'})if __name__ == '__main__': app.run(host="0.0.0.0", port=8080)(3)执行flask服务打包#pyinstaller -p venv\Lib\site-packages -F --icon=铅笔.ico myapp.py --noconsolepyinstaller -F -p D:\0627\hello myapp.py参数名描述说明-D生成one-folder的程序(默认)生成结果是一个目录,各种第三方依赖、资源和exe同时存储在该目录-F生成one-file的程序生成结果是一个exe文件,所有的第三方依赖、资源和代码均被打包进该exe内–specpath指定.spec文件的存储路径默认:当前目录-n生成的.exe文件和.spec的文件名默认:用户脚本的名称,即main.py和main.spec-p指定额外的import路径类似于使用PYTHONPATH 参见PYTHONPATH-d执行生成的main.exe时,会输出pyi的一些log,有助于查错默认:不输出pyi的log-c显示命令行窗口与-w相反,默认含有此参数-w不显示命令行窗口编写GUI程序时使用此参数有用。-i为main.exe指定图标pyinstaller -i beauty.ico main.py

(4)注册windows服务 nssm是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行。同类型的工具还有微软自己的srvany,不过nssm更加简单易用,并且功能强大。

nssm应该在 Windows 2000 或更高版本下工作。具体来说,支持 Windows 7、Windows 8 和Windows 10。下载中包含 32 位和 64 位二进制文​​件。大多数时候在 64 位 Windows 上运行 32 位版本应该是安全的,但在某些情况下您可能会发现它不起作用,您必须使用 64 位版本。两个版本都是从相同的源代码编译而来的。如果一个对你有用,就用那个。如果没有,请尝试另一个。

直接下载:

https://nssm.cc/release/nssm-2.24.zip

(1)服务安装

nssm install <servicename>nssm install <servicename> <program>nssm install <servicename> <program> [<arguments>]

默认情况下,服务的启动目录将设置为包含program. 安装服务后,可以覆盖启动目录。

nssm set <servicename> AppDirectory <path>

(2)服务移除

nssm removenssm remove <servicename>nssm remove <servicename> confirm

(3)启动和停止服务

nssm start <servicename>nssm stop <servicename>nssm restart <servicename>

(4)查询服务状态

nssm status <servicename>

在cmd中进入nssm中的目录,然后进行命令 nssm install myapp(自定义的服务名) 选择Application path按钮将pyinstaller打包后的exe文件选择过来。 点击installer service按钮,则提示成功,此时去windows服务中查看服务即可。

启动和停止我们的服务如下: 任务管理器查看服务状态如下:

5.2 pywin32(1)安装相关库pip install flask gevent pywin32(2)编写代码 myapp.py:from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/')def hello_world(): return 'Hello World,爱看书的小沐!'@app.route('/modelstatus', methods=['GET', 'POST'])def train_status(): if request.method == 'GET': return jsonify({'code': 200, 'status': 'false', 'msg': 'hello'}) else: return jsonify({'code': 500, 'msg': '不支持该请求'})

myservice.py:

import win32serviceutilfrom gevent.pywsgi import WSGIServerfrom myapp import appclass MyFlaskService(win32serviceutil.ServiceFramework): # 服务名 _svc_name_ = "myservice_dtale" # 显示服务名 _svc_display_name_ = "myservice_dtale" # 描述 _svc_description_ = "myservice_dtale's description" def __init__(self, *args): super().__init__(*args) # host和ip绑定 self.http_server = WSGIServer(('127.0.0.1', 9090), app) self.SvcStop = self.http_server.stop self.SvcDoRun = self.http_server.serve_foreverif __name__ == '__main__': win32serviceutil.HandleCommandLine(MyFlaskService)

myserver.py:(另一个写法)

import win32serviceutilimport win32serviceimport win32eventimport win32evtlogutilimport servicemanagerimport socketimport osimport syssys.path.append(os.path.dirname(__name__))# import dtale# import pandas as pdfrom gevent.pywsgi import WSGIServerfrom myapp import appclass MyDTaleService (win32serviceutil.ServiceFramework): # 服务名 _svc_name_ = "myservice_dtale" # 显示服务名 _svc_display_name_ = "myservice_dtale" # 描述 _svc_description_ = "myservice_dtale's description" def __init__(self, *args): super().__init__(*args) self.hWaitStop = win32event.CreateEvent(None,0,0,None) socket.setdefaulttimeout(5) self.stop_requested = False # create server self.http_server = WSGIServer(('127.0.0.1', 9090), app) def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) self.ReportServiceStatus(win32service.SERVICE_STOPPED) self.stop_requested = True # stop server self.http_server.stop() def SvcDoRun(self): servicemanager.LogMsg( servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_,'') ) # start server self.main() def main(self): # df = pd.DataFrame([dict(a=1,b=2,c=3), dict(a=123.732,b=1.414,c=3.1415)]) # dtale.show(df, open_browser=False) self.http_server.serve_forever()if __name__ == '__main__': win32serviceutil.HandleCommandLine(MyDTaleService)(3)添加系统环境变量# 注意环境变量要加在系统环境变量的Path中,不要加在用户的环境变量中C:\Python38C:\Python38\Scripts#C:\Python38\Lib\site-packages\win32C:\Python38\Lib\site-packages\pywin32_system32(4)安装服务服务安装python myservice.py install让服务自动启动python myservice.py --startup auto install启动服务python myservice.py start重启服务python myservice.py restart停止服务python myservice.py stop删除/卸载服务python myservice.py remove

6、whl文件制作

wheel是python新的发行标准,旨在替代传统的egg,pip >=1.4的版本均支持wheel, 使用wheel作为你python库的发行文件,有如下好处:

纯Python和本机C扩展软件包的安装速度更快避免执行任意代码进行安装。(避免setup.py)C扩展的安装不需要在Linux,Windows或macOS上进行编译允许更好地缓存以进行测试和持续集成在安装过程中创建.pyc文件,以确保它们与使用的Python解释器匹配跨平台和机器的安装更加一致6.1 安装

pip wheel 使用要求: setuptools>=0.8 和 wheel pip wheel 使用包 wheel 包提供的 bdist_wheel 这个 setuptools 扩展来构建单个 wheel

pip install wheelpip install --upgrade setuptools#orpython3 -m pip install --user --upgrade setuptools wheel6.2 示例

准备文件如下:

init.py:

# -*- coding: utf-8 -*-# __init__.pyfrom .myapp import *from .myservice import *

setup.py:

# -*- coding: utf-8 -*-# setup.pyfrom setuptools import setup, find_packagessetup( name='myApp', version='1.1', packages=find_packages(), author='tomcat', author_email='xxx@163.com', description='测试打包', url='http://www.baidu.com', classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], python_requires='>=3.6',)

执行命令行命令wheel,生成whl文件。

python .\setup.py bdist_wheel# orpython setup.py sdist bdist_wheel

另外还可以:pip wheel --wheel-dir=/root/whl ./

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭ 如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O??? 如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡) 感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本文链接地址:https://www.jiuchutong.com/zhishi/298400.html 转载请保留说明!

上一篇:VUE 中项目启动没有问题,代码中 script 标签有蓝色波浪线标注(vue项目启动过程)

下一篇:代码会说话——pyttsx3简介(用代码说话)

  • 微信对方忙线中是拉黑吗(微信对方忙线中可以设置吗)

    微信对方忙线中是拉黑吗(微信对方忙线中可以设置吗)

  • 钉钉共享屏幕没有声音(钉钉共享屏幕没有声音怎么办)

    钉钉共享屏幕没有声音(钉钉共享屏幕没有声音怎么办)

  • 华为手机新机怎么充电(华为手机新机怎么激活)

    华为手机新机怎么充电(华为手机新机怎么激活)

  • wptx64能卸载吗

    wptx64能卸载吗

  • esp是文字文档后缀吗(文件esp是什么意思)

    esp是文字文档后缀吗(文件esp是什么意思)

  • 快手带绿点是什么意思(发现快手有绿点是怎么回事啊)

    快手带绿点是什么意思(发现快手有绿点是怎么回事啊)

  • 苹果8保修期多长时间(苹果保修期多了12天是什么原因)

    苹果8保修期多长时间(苹果保修期多了12天是什么原因)

  • 小米8青春版屏幕刷新率(小米8青春版屏幕比例)

    小米8青春版屏幕刷新率(小米8青春版屏幕比例)

  • 唯品会公众号怎么关注(唯品会公众号怎么注销)

    唯品会公众号怎么关注(唯品会公众号怎么注销)

  • 共享位置为什么只能看到自己(共享位置为什么一直不更新位置)

    共享位置为什么只能看到自己(共享位置为什么一直不更新位置)

  • 候补订单截止兑现时间是什么意思(候补订单截止兑现时间)

    候补订单截止兑现时间是什么意思(候补订单截止兑现时间)

  • access图表向导在哪(access表单向导)

    access图表向导在哪(access表单向导)

  • ps字体怎么填充图案(ps字体怎么填充图片)

    ps字体怎么填充图案(ps字体怎么填充图片)

  • vivo高清通话怎么设置(vivo高清通话怎么设置不了)

    vivo高清通话怎么设置(vivo高清通话怎么设置不了)

  • 淘宝怎么取消延迟收货(淘宝怎么取消延迟发货)

    淘宝怎么取消延迟收货(淘宝怎么取消延迟发货)

  • 手机流量怎么给台式电脑用(手机流量怎么给别的手机用)

    手机流量怎么给台式电脑用(手机流量怎么给别的手机用)

  • iPhone11pro怎么关闭siri应用建议(iphone11pro怎么关机开机)

    iPhone11pro怎么关闭siri应用建议(iphone11pro怎么关机开机)

  • wps怎么替换文字(wps怎么替换文字字体不变)

    wps怎么替换文字(wps怎么替换文字字体不变)

  • 苹果xsmax是几核处理器(苹果xsmax是a十几处理器)

    苹果xsmax是几核处理器(苹果xsmax是a十几处理器)

  • 快手怎么设置浏览方式(快手怎么设置浏览界面和以前一样)

    快手怎么设置浏览方式(快手怎么设置浏览界面和以前一样)

  • videoleap怎么调时间(videoleap速度在哪里调)

    videoleap怎么调时间(videoleap速度在哪里调)

  • vivox27手机能扫脸解锁吗(vivo手机有没有扫描功能,怎么用?)

    vivox27手机能扫脸解锁吗(vivo手机有没有扫描功能,怎么用?)

  • p30如何设置通话背景(华为p30怎么设置通话)

    p30如何设置通话背景(华为p30怎么设置通话)

  • 如何查询淘金币即将过期(怎么查淘金币)

    如何查询淘金币即将过期(怎么查淘金币)

  • 小米电脑触摸板没反应(小米电脑触摸板开关快捷键)

    小米电脑触摸板没反应(小米电脑触摸板开关快捷键)

  • 快手原创作品怎么弄(快手原创作品怎么删除掉)

    快手原创作品怎么弄(快手原创作品怎么删除掉)

  • 桃胶多少钱一斤(桃胶多少钱一斤正常)

    桃胶多少钱一斤(桃胶多少钱一斤正常)

  • 刚打完发票可以注销税控盘吗
  • 国家税务总局操作指引
  • 股权转让需要缴纳企业所得税吗
  • 非税缴税是什么意思
  • 公司用的口罩放哪个科目
  • 买车哪些费用不该交
  • 理财收益交增值税
  • 被客户扣钱怎么办
  • 银行提备用金怎么提
  • 上年度职工月平均工资是税前还是税后
  • 工会福利费列支范围
  • 母子公司间提供保洁保安合法吗
  • 企业网银电子商务收入是什么
  • 限制性股票科目
  • 外购技术服务费包括哪些
  • 与收益相关政府补助区分总额法净额法吗
  • 企业停产或停业期间的费用包括
  • 主营业务税金及附加包括增值税吗
  • 公司出差员工有权拒绝吗
  • 发票密码区超出还能用吗
  • 一般纳税人怎么交税
  • 增值税专用发票几个点
  • 代扣代缴个人所得税现金流计入哪里
  • 2016年的发票2020年可以认证吗
  • 半成品牛排有营养吗
  • 银行余额不平怎么快速找原因
  • 油类增值税是多少
  • 反映留存收益的账户
  • 公益性捐赠的个税
  • 私车公用报销怎么算
  • 挂靠别人的资质进行房屋建筑会计怎样做账?
  • 税控设备指什么
  • bios里面怎么设置中文
  • 资产负债表存货包括哪些科目
  • 微软发布windows
  • pddpic是什么文件
  • PHP:curl_reset()的用法_cURL函数
  • mac修改系统版本号
  • 子公司财务管理策略有哪些
  • 【强化学习探索01】Win10 下gym安装
  • 长期借款的
  • nvidia-smi failed to initialize
  • 有什么办法解决前进中的问题
  • 一般纳税人的好处和坏处
  • 2023新版拳击航母
  • vue 如何使用
  • 现金折扣账务处理
  • 手机话费怎么打发票
  • 食堂增值服务有哪些
  • 所有进项增值税怎么申报
  • 进项税额转出月底需要结转吗
  • mysql5.7性能优化
  • mongodb怎么导入文件
  • 微店企业店铺和个人店铺的区别
  • 增值税发票抵扣联丢失怎么办
  • 项目差旅费可以直接计入劳务成本吗
  • 残保金如何做会计分录
  • 建筑行业收到的工程转给项目经理成本票从哪来
  • 收到的货品与实物不符
  • 会计估计变动怎么处理
  • 公司为员工租房应注意
  • 新办企业建账
  • 私企银行有哪几家
  • 如何设置微信语音来电铃声
  • sun solaris 8何启用telnet ftp 功能
  • mac系统播放器声音小
  • linux中使用什么命令可以把两个文件合并
  • windowsxp服务在哪里
  • 阿里云服务器linux系统
  • win8如何打开任务管理器
  • WIN7如何关闭自动关机
  • Python分析学校四六级过关情况
  • 在linux的主要组成部分中最基础的是哪一项?
  • javascript基础笔记
  • 实现非常简单的英文
  • asyncio 的 coroutine对象 与 Future对象使用指南
  • 甘肃省政府非税收入电子发票在哪里打印
  • 教育培训行业的发展前景
  • 江苏食品经营许可证企业端官网
  • 国家税务总局2011年34号公告
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号