如何打包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基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
Python求出0~100以内的所有素数
Jan 23 Python
使用python脚本实现查询火车票工具
Jul 19 Python
Linux下python制作名片示例
Jul 20 Python
Python实现数据结构线性链表(单链表)算法示例
May 04 Python
django API 中接口的互相调用实例
Apr 01 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
python interpolate插值实例
Jul 06 Python
python实现AdaBoost算法的示例
Oct 03 Python
详解Python调用系统命令的六种方法
Jan 28 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 Python
Python制作一个随机抽奖小工具的实现
Jul 07 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中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
react-router中的属性详解
2017/06/01 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
python执行外部程序的常用方法小结
2015/03/21 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
母亲节演讲稿
2014/05/27 职场文书
捐书倡议书
2014/08/29 职场文书
公司开业主持词
2015/07/02 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
采购员工作总结范文
2015/08/12 职场文书
观看安全警示教育片心得体会
2016/01/15 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记
windows10声卡驱动怎么安装?win10声卡驱动安装操作步骤教程
2022/08/05 数码科技