一、现状
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网站应用 就打包制作完成了。
总结
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】