如何打包Python Web项目实现免安装一键启动的方法
作者:恋习Python 发布时间:2022-08-16 19:28:48
一、现状
Python 有诸多优秀的 Web 开发框架供我们使用,比如Django、Flask、Sanic。正常的情况下,我们基于这些 Web 框架开发好了网站,最终都会使用 Nginx 搭配 uWSGI 或gunicorn 将其部署在 Linux 服务器上,这样,用户就可以通过 绑定的域名或 IP 地址访问。
是的,这是正常的情况。
往往很多场景,我们面对的就不是一个正常的情况。正常的情况下一切环境的问题都不是问题,因为有运维的伙伴帮我们处理好了所有环境的问题,从Python特定版本的安装,到特定依赖库的安装,再到服务的配置。一切都不需要操心。
但是,如果所有的这些问题都需要自己操心呢?那可真是一个灾难性的问题。 Docker的出现解决了一部分的问题,但是对于完全小白而言,docker的安装和使用,又成为了一个问题。
州的先生在开发MrDoc觅道文档的时候,就遇到了这个问题。如果要源码安装 MrDoc,那么需要:
安装Python(基本不会出问题)
pip安装依赖库(非常容易出问题)
安装依赖的第三方软件包(非常容易出问题)
很多想体验一下 MrDoc 的小伙伴, 直接就死在了第二步 ,各种报错无所适从。
有 MrDoc 交流群里的热心伙伴制作了docker镜像,这解决了一定的环境问题,但是 对于真正零基础的计算机小白而言,命令行还是自带恐惧属性。
怎么办呢? 能不能让Python编写的Web项目像 PHP 或GO 语言编写的Web服务一样可以直接启动呢?
在互联网上逛荡了老半天,发现老伙计——PyInstaller可以实现这个功能。
二、打包
PyInstaller是Python中一个用于将Python程序打包为可执行文件的第三方模块。 州的先生之前经常使用它将PyQt5编写的桌面图形界面程序打包分发。来看看它在打包Web程序上的应用。
PyInstaller官方提供了一个打包Django项目的文档,其链接为: https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Executable-From-Django
按照这个文档,我们根据项目的具体情况,运行下述命令:
<span><span style="font-size: 14px;">
pyinstaller --name=mysite mysite/manage.py
</span>
</span>
就会得到一个dist文件夹,里面包含了运行Django项目的所有文件,我们打开命令行界面,使用xxx.exe文件就可以达到像正常使用:
<span>
<span style="font-size: 14px;">
python manage.py
</span>
</span>
一样的效果。比如运行runserver服务:
<span>
<span style="font-size: 14px;">
xxx.exe runserver
</span>
</span>
但是, 很大概率是运行不起来的,报错的信息,不是缺少模块,就是缺少静态文件。
我们需要显式地告诉PyInstaller,哪些包、哪些模块、哪些文件需要一起打包进去。
在上一次运行 pyinstaller 命令之后,文件夹下会生成一个 .spec后缀的配置文件 ,其实质是一个Python文件,我们对其进行修改。
<span>
<span style="font-size: 14px;">
import sys
</span>
</span>
<span>
<span style="font-size: 14px;">
sys.setrecursionlimit(5000)
</span>
</span>
在文件第3行的位置,添加上述2行代码,用于 避免pyinstaller索引模块层级的错误 。
然后,在datas列表中, 将Django项目的静态文件目录、媒体文件目录、以及其他使用到的文件目录全都以元组的形式添加进去。 这会让PyInstaller直接将这些文件打包到最后生成的文件夹中。
接着,在hidedenimports列表中, 将Django项目的应用模块路径也添加进去。 可以根据每次生成的报错来一个一个添加,但是那样太浪费时间了,还不如直接都添加进去。
修改好了之后,我们把之前生成的build目录和dist目录删除,使用spec文件调用Pyinstaller命令:
<span>
<span style="font-size: 14px;">pyinstaller MrDoc.spec
</span>
</span>
等待一会儿,整个Django项目就打包好了,其完整的打包文件如下所示:
三、效果
打包好之后,我们打开命令行界面,输入命令:
<span>
<span style="font-size: 14px;">
mrdoc.exe runserver
</span>
</span>
就启动了Django Web网站,如下图所示:
在浏览器上访问: 127.0.0.1:8000 就可以看到我们的MrDoc觅道文档了:
为了方便使用,我们还可以写一个bat脚本,双击即可启动它,免去打开命令行界面输入命令的繁琐:
<span>
<span style="font-size: 14px;">
start ./mrdoc.exe runserver
</span>
</span>
这样,一个 免安装、一键启动的Django网站应用 就打包制作完成了。
来源:http://mp.weixin.qq.com/s?__biz=MzIzNTg3MDQyMQ==&mid=2247486890&idx=2&sn=b6e9f1f2a13d125dfdbac003881578ef


猜你喜欢
- 最近发现了一个宝藏动态可视化库,非常简单,即使是小白也能轻松上手。这个库就是motionchart,它能够用 pandas 的 datafr
- Python中一切都是对象。类提供了创建新类型对象的机制。这篇教程中,我们不谈类和面向对象的基本知识,而专注在更好地理解Python面向对象
- 项目说明 该电商项目类似于京东商城,主要模块有验证、用户、第三方登录、首页广告、商品、购物车、订单、支付以及后台管理系统。项目开发模式采用前
- 树莓派没有显示器,而不想设置固定IP,因为要随身携带外出,每个网络环境可能网段不一样。因此想用python写个脚本,让树莓派开机后自动获取本
- 翻译说明:这是Solid State Group网站上的一篇很友好的文章,解决了我在设计中遇到的很多问题,故在此我翻译其文,并对原作者表示非
- 知乎上有人说,Python3.6以后字典有序且更高效了。群里有同学推荐了这篇文章给我看,并咨询字典排序的问题。大致浏览了一下,我当即表示不能
- 含义切片是一个种特殊的数组。是对数组的一个连续片段的引用,所以切片是一个引用类型。切片可以是数组中的一部分,也可以是由起始和终止索引标识的一
- 1 导言 Microsoft 在Microsoft SQL Server 2000中推出了与XML相关的功能以及Transact-SQL 关
- label与one-hot之间的互相转换有时候需要label,比如强化学习的离散动作空间,输出动作索引;有时候需要one-hot,比如训练数
- 本文实例为大家分享了javascript实现向表格中动态加载数据的具体代码,供大家参考,具体内容如下首先在HTML中编写表格信息<ta
- 文 | 闲欢来源:Python 技术「ID: pythonall」今天在浏览知乎时,发现一个有趣的问题:如何优化 Python 爬
- 1. 字符编码简介1.1. ASCIIASCII(American Standard Code for Information Interc
- 前言JSHint用于分析和验证JavaScript代码是否符合您的编码规则。这个强大的工具可以帮助发现您代码中错误和问题T,它强制你的团队保
- 字符串类型代码的执行字符串类型代码的执行函数有三个,都是Python的内置函数。eval()执行字符串类型的代码,并返回最终结果。exec(
- link(){var olink = getElementById("link");var text = olink.i
- Hpack 是啥Hpack 是 HTTP2 的头部压缩算法。在 HTTP1 中,每次传输都会有大量的 Header 携带,我们可以拿一个实际
- 什么是机器学习 (Machine Learning) 机器学习是研究计算机怎样模
- 最近又新上了一部分站点,随着站点的增多,管理复杂性也上来了,俗话说:人多了不好带,我发现站点多了也不好管,因为这些站点里有重要的也有不重要的
- HTML代码:在一个div容器内,设置3个span<body><div id="i1"> &nb
- 摘要: 当你想快速共享一个目录的时候,这是特别有用的,只需要1行代码即可实现。当你想快速共享一个目录的时候,这是特别有用的,只需