如何打包Python Web项目实现免安装一键启动的方法


Posted in Python onMay 21, 2020

一、现状

Python 有诸多优秀的 Web 开发框架供我们使用,比如Django、Flask、Sanic。正常的情况下,我们基于这些 Web 框架开发好了网站,最终都会使用 Nginx 搭配 uWSGI 或gunicorn 将其部署在 Linux 服务器上,这样,用户就可以通过 绑定的域名或 IP 地址访问。

如何打包Python Web项目实现免安装一键启动的方法

是的,这是正常的情况。

往往很多场景,我们面对的就不是一个正常的情况。正常的情况下一切环境的问题都不是问题,因为有运维的伙伴帮我们处理好了所有环境的问题,从Python特定版本的安装,到特定依赖库的安装,再到服务的配置。一切都不需要操心。

但是,如果所有的这些问题都需要自己操心呢?那可真是一个灾难性的问题。 Docker的出现解决了一部分的问题,但是对于完全小白而言,docker的安装和使用,又成为了一个问题。

如何打包Python Web项目实现免安装一键启动的方法

州的先生在开发MrDoc觅道文档的时候,就遇到了这个问题。如果要源码安装 MrDoc,那么需要:

  • 安装Python(基本不会出问题)
  • pip安装依赖库(非常容易出问题)
  • 安装依赖的第三方软件包(非常容易出问题)

很多想体验一下 MrDoc 的小伙伴, 直接就死在了第二步 ,各种报错无所适从。

有 MrDoc 交流群里的热心伙伴制作了docker镜像,这解决了一定的环境问题,但是 对于真正零基础的计算机小白而言,命令行还是自带恐惧属性。

如何打包Python Web项目实现免安装一键启动的方法

怎么办呢? 能不能让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索引模块层级的错误

如何打包Python Web项目实现免安装一键启动的方法

然后,在datas列表中, 将Django项目的静态文件目录、媒体文件目录、以及其他使用到的文件目录全都以元组的形式添加进去。 这会让PyInstaller直接将这些文件打包到最后生成的文件夹中。

如何打包Python Web项目实现免安装一键启动的方法

接着,在hidedenimports列表中, 将Django项目的应用模块路径也添加进去。 可以根据每次生成的报错来一个一个添加,但是那样太浪费时间了,还不如直接都添加进去。

修改好了之后,我们把之前生成的build目录和dist目录删除,使用spec文件调用Pyinstaller命令:

<span>
<span style="font-size: 14px;">pyinstaller MrDoc.spec
</span>
</span>

等待一会儿,整个Django项目就打包好了,其完整的打包文件如下所示:

如何打包Python Web项目实现免安装一键启动的方法

三、效果

打包好之后,我们打开命令行界面,输入命令:

<span>
<span style="font-size: 14px;">
mrdoc.exe runserver
</span>
</span>

就启动了Django Web网站,如下图所示:

如何打包Python Web项目实现免安装一键启动的方法

在浏览器上访问: 127.0.0.1:8000 就可以看到我们的MrDoc觅道文档了:

如何打包Python Web项目实现免安装一键启动的方法

为了方便使用,我们还可以写一个bat脚本,双击即可启动它,免去打开命令行界面输入命令的繁琐:

<span>
<span style="font-size: 14px;">
start ./mrdoc.exe runserver
</span>
</span>

这样,一个 免安装、一键启动的Django网站应用 就打包制作完成了。

总结

到此这篇关于如何打包Python Web项目实现免安装一键启动的方法的文章就介绍到这了,更多相关打包Python Web项目内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现删除Android工程中的冗余字符串
Jan 19 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
python爬取网页内容转换为PDF文件
Jul 28 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
python实现随机漫步算法
Aug 27 Python
Python逐行读取文件中内容的简单方法
Feb 26 Python
python如何以表格形式打印输出的方法示例
Jun 21 Python
利用python求积分的实例
Jul 03 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
django处理select下拉表单实例(从model到前端到post到form)
Mar 13 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
讲解Python实例练习逆序输出字符串
May 06 Python
keras之权重初始化方式
May 21 #Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 #Python
Python使用os.listdir和os.walk获取文件路径
May 21 #Python
keras 权重保存和权重载入方式
May 21 #Python
浅谈keras保存模型中的save()和save_weights()区别
May 21 #Python
Python通过文本和图片生成词云图
May 21 #Python
解决在keras中使用model.save()函数保存模型失败的问题
May 21 #Python
You might like
php win下Socket方式发邮件类
2009/08/21 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
PHP strripos函数用法总结
2019/02/11 PHP
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
vue下canvas裁剪图片实例讲解
2020/04/16 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
python中split方法用法分析
2015/04/17 Python
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
python 读写中文json的实例详解
2017/10/29 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
设置python3为默认python的方法
2018/10/31 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
python实现126邮箱发送邮件
2020/05/20 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
Staples美国官方网站:办公用品一站式采购
2016/07/28 全球购物
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
工程招投标邀请书
2014/01/26 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
公司给客户的感谢信
2015/01/23 职场文书
男人帮观后感
2015/06/18 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书
Java设计模式之代理模式
2022/04/22 Java/Android