为什么要打包?
当你想把你做的python游戏或者是脚本等.py文件发给别人时,打包为.exe文件,即使对方没有安装python也能运行。
安装pyinstaller
安装pyinstaller很简单,直接cmd使用pip命令即可
1 | pip install pyinstaller |
pyinstaller打包项目全过程
项目包含多个 Python 文件、多个个资源文件夹,资源文件夹里面又包含了一些子文件夹和 图片。
第一步:启动虚拟环境,切换至目标文件夹路径位置
虚拟环境创建方法见本文附录
如图已进入项目目录,虚拟环境已激活(py37)
第二步:虚拟环境安装pyinstaller与其他第三方包(使用虚拟环境是为了使得依赖包调用最少,尽量使exe文件为轻量级)
1 | pip install pyinstaller |
第三步:生成 spec 文件(Pyinstaller 已经安装)
1 | pyi-makespec -F -w Main.py |
第五步:编辑 spec 文件
如图所示,第一个方框内是写入所有打包的.py文件,datas中写入所有项目的资源文件夹,由于我将其他python文件编写为了python软件包并放在了虚拟环境目录下,所以只有一个Main.py需要被打包。
自己编写的包可以放在虚拟环境的”.\venv\Lib\site-packages”路径下,关于如何将自己写的python文件编为python软件包:文件夹内含有“init.py”文件,则该文件夹默认为python软件包
第六步:打包项目(注意这里的对象是 spec 文件)
1 | Pyinstaller Main.spec |
打包成功!
注:我的项目文件中用到了虚拟环境中face_recognition_models文件夹下的shape_predictor_68_face_landmarks.dat,但是打包过程中无法将它跟随虚拟环境打包,于是我将它跟随资源文件打包,解决了这个问题。
最后在项目中的 dist 文件夹,打开后会有一个 exe 文件,该文件可在windows系统中独立执行,不再依赖自行创建的python环境。
参数选项 | 描述 |
---|---|
-F, -onefile | 只生成一个单个文件(只有一个 exe 文件) |
-D, -onedir | 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,这样代码易于维护 |
-K, –tk | 在部署时包含 TCL/TK |
-a, -ascii | 不包含编码在支持 Unicode 的 Python 版本上默认包含所有的编码 |
-d, -debug | 产生 debug 版本的可执行文件 |
-w, -windowed, -noconsole | 使用 Windows 子系统执行当程序启动的时候不会打开命令行(只对 Windows 有效) |
-c, -nowindowed, -console | 使用控制台子系统执行(默认)(只对 Windows 有效)、pyinstaller -c xxxx.py、pyinstaller xxxx.py —console |
-s, -strip | 可执行文件和共享库将 run through strip |
-X, -upx | 如果有 UPX 安装(执行 Configure.py 时检测),会压缩执行文件( Windows 系统中的 DLL 也会) |
-o DIR, -out=DIR | 指定 spec 文件的生成目录,如果没有指定,而且当前目录是 PyInstaller 的根目录,会自动创建一个用于输出( spec 和生成的可执行文件)的目录、如果没有指定,而当前目录不是 Pyinstaller 的根目录,则会输出到当前的目录下 |
-p DIR, -path=DIR | 设置导入路径(和使用 PYTHONPATH 效果相似)、可以用路径分割符( Windows 使用分号,Linux 使用冒号)分割,指定多个目录、也可以使用多个 -p 参数来设置多个导入路径,让 pyinstaller 自己去找程序需要的资源 |
-i -icon= |
将 file.ico 添加为可执行文件的资源(只对 Windows 系统有效),改变程序的图标 |
以上是pyinstaller常用命令,更多内容请见官网
附录 Python常用命令
创建虚拟环境
python创建虚拟环境
1 | md envs |
设置国内源
1 | # 清华源 |
1 | # 阿里源 |
1 | # 腾讯源 |
1 | # 豆瓣源 |
使用requirement.txt批量安装
pip安装 requirments.txt
1 | pip install -r ./requirements.txt |
对项目生成requirement依赖,以便于其他人对项目的fork
freeze-适用于虚拟环境
1 | #生成requirement依赖 |
检查cuda版本(cmd命令)
1 | nvidia-smi |
常用Python代码
python消除警告
1 | import warnings |
plt绘图中文乱码
1 | plt.rcParams['font.sans-serif'] = ['KaiTi', 'SimHei', 'FangSong'] # 汉字字体,优先使用楷体,如果找不到楷体,则使用黑体 |
使用pip安装notebook
1 | pip install jupyter notebook |
更改juypter打开默认位置
1 | jupyter notebook --generate-config |
Python使用代理
1 | import os |