最近在尝试将python项目打包成exe,搜索了下发现普遍是2种解决方案,一个是py2exe,但是该包似乎很久没有维护了;一个是pyinstaller,网上大多推荐的也是这种
使用方法
- 安装
直接采用pip安装,pip install pyinstaller
- 使用
直接生成exe文件,pyinstaller [options] script.py
或者先生成spec
文件,pyi-makespec [options] script.py
,对spec
按照需求修改之后,再生成exe,pyinstaller script.spec
- 常用options说明
options | description |
---|---|
-D,--onedir | 创建一个包含可执行文件的单文件夹包(默认),包括一些三方的module |
-F, --onefile | 创建一个打包的可执行文件 |
--specpath DIR | 存储生成的spec文件的文件夹(默认:当前目录) |
-n NAME, --name NAME | 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字 |
-a,--ascii | 不包含 Unicode 字符集支持 |
-d,--debug | 产生 debug 版本的可执行文件 |
-p DIR,--path=DIR | 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux使用冒号)来分隔多个路径 |
-w,--windowed,--noconsolc | 指定程序运行时不显示命令行窗口(仅对 Windows 有效) |
使用过程中遇到的错误
- file not find
项目里引用外部资源,打包时不会将这些资源一起打包,所以运行时会出现文件找不到的情况,建议项目里对于外部资源文件采用相对路径的方式
进行引用,或者在生成的spec文件里面对路径重新定向
- module not found
这种情况一般有自定义的模块和外部三方模块无法找到的情况
对于自定义的情况,修改import的路径,从项目根节点开始引用
对于外部三方的模块,可以修改sepc文件的hiddenimports
,将需要的包名放进去,以逗号隔开
使用缺点
- 打包推荐使用虚拟环境,在虚拟环境里面只安装需要的模块,否则会造成程序打包极大,因为这里会导入一些无用的模块
- 启动时非常慢,据说是pyinstaller的原因