赞
踩
Pyinstaller是python文件打包成可执行文件exe最常用的工具之一。一般情况下,使用十分方便。
pyinstaller -F xx.py 即可完成xx文件的打包。只是在实际使用中,根据不同的项目依赖和需求,会有一些不同的操作。
参数 | 解释 |
-D, --onedir | 打包成一个文件夹 |
-F, --onefile | 打包成一个可执行文件(exe) |
-n NAME, --name NAME | 指定打包后文件的名字,默认主py文件的名字 |
--add-data | 添加其他依赖资源 |
-w, --windowed | 针对windows和MacOS,运行时不出现console窗口 |
-i | 指定图标文件 |
要获得所有参数及解释,运行pyinstaller -h
-D 打包成一个文件夹,其效果和你安装的一般软件差不多。包含一个入口文件xx.exe和一系列依赖。
打包成一个文件夹 打包成一个文件
-F 就是整体打包成一个文件,也就是说,你得到的就是一个xx.exe。这两种方式比较直观的差异就是:打包成文件夹,其所占内存空间会更大,但执行速度会稍快一点。
-n 就是给你打包后的文件或文件夹取名字,默认就是py文件的名字xx。这个感觉不重要,你完全可以打包完后重命名。
-w 就是运行时,不会出现控制台窗口。好处就是不会显得很low(双击弹出一个黑框),缺点就是你的一些print打印和报错信息无法查看。(也不是绝对的,可以单独开启一个窗口,然后去运行exe,这样总会出现窗口)
-i 是指定xx.exe的图标文件,不指定时会有默认图标。
--add-data 指定其他依赖资源。打包,实际上就是编译,所有的python代码都会被处理,包括import语句。但如果你的项目包含一些非py文件或py文件并不是通过import引入,那这些文件将会被忽略。此时,就可以通过这个参数指定。
这个情况将在下文更详细展开
这个组合并不是说有多常见,而是足够有代表性。可能会遇到的问题如下
比如,在创建app之前,我需要导入配置文件,语句是这样的
- app = Flask(__name__)
- # 加载配置文件
- app.config.from_object('app.setting')
这个setting.py文件并不是通过import语句导入的,因此如果直接打包,运行会提示找不到这个文件。而对于pyecharts或者说你的项目依赖的很多前端的模板、脚本、样式等文件。这些文件也会被pyinstaller忽略。直接打包运行同样会报错。
在我无数次打包失败的基础上,我将这个类型的项目如何打包含泪总结如下:
项目的整体结构
(1)不要使用conda创建的虚拟环境,直接使用原生python。(我也尝试过使用"python -m venv name"语句创建的虚拟环境,可行)
(2)安装好需要的依赖,pip install aa,bb
(3)选择打包成一个文件夹,方便后面补充依赖,pyinstaller -D xx.py -i abc.ico
(4)原app目录里的py文件(配置文件除外)都已被打包,但却没有app这个文件夹。手动创建,并根据原项目的结构,补充前端文件和配置文件。其他需要的文件夹类似。(通过时间也可以看出,app和data等文件夹是后创建的)
app文件夹内添加
(5)此时,如果你运行程序,发现仍会提示找不到某某文件。别着急,缺什么补什么。针对这个项目,会缺少pymysql(没有导入语句),pyecharts,numpy的部分文件(直接全部替换)。将python环境中site-packages文件夹下相应的依赖包拷贝到项目打包后的文件夹里即可。
补充文件夹
至此,这个项目的打包已完成。因为不是专业搞网站开发,都是遇到问题解决问题。我想,对于这样的项目打包,可能是有更好的方案,希望大佬多多指教。
3、64位和32位
虽然现在早已全民小康了,但免不了一些老项目可能使用32位系统。那么如果打包的计算机是64位的,这个exe就是64位的,也就无法在32位系统上运行。解决办法就是安装32位的python,然后安装相应的依赖,最后执行打包。其他没什么区别。
关于安装32位python,有两种方法。
其一是官网下载32位安装包
其二是使用conda
- set CONDA_FORCE_32BIT=1 //切换到32位
- conda create --name python_test python=3.6 //创建一个python3.6的环境,命名为python_test
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。