Pyinstaller打包exe文件
1. 写在前面的话
帮同事用Python写了个小工具,读入xlsx文件,根据xlsx中的数据输出图片,用tkinter做的GUI,代码参考了【作者:清风Python】的一篇文章1。
但是在整个过程中遇到了很多问题,在这里做一个汇总整理。
结合其他博客整理的小Tips2:
- 在代码里面尽量不要用import,能from…import…就尽量用这个,因为如果是import的话,在打包的时候,会将整个包都打包到exe里面,增大工具的大小。
- 我的图标是用在线转换工具转的,可以将自己想要的图片做成ico,如果想用一些标准制作的图标,可以试一下这个图标网站。
2. 我用到的Pyinstaller参数介绍
因为网上很多地方可以查到所有参数,我这里只列出了我用到过的,我也较熟悉,以作记录。我在打包的过程中运行的代码格式基本如下:
pyinstaller -F -w -i icofilec.ico pythonfilename.py
参数 | 参数介绍 |
---|---|
-F, --onefile | 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用 |
-D, --onedir | 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码 |
-w,–windowed,–noconsole | 加上这个参数程序运行时不显示 控制台窗口(黑黑的那个窗口),不加上则显示。(只对Windows有效) |
-i, --icon | 将file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标 pyinstaller -i ico路径 xxxxx.py |
# 如果已经使用了-F参数,可以再运行下面的代码查看
pyinstaller -D pythonfilename.py
3. 我用过的环境
3.1 Anaconda的Environments
【首先成功运行的环境,后来还是用了Pycharm的venv】
为了测试,Create了一个新的Environments,在新环境中安装了一个Spyder,在Spyder中运行了py文件,根据报错信息,挨个安装运行py文件需要的库。
等到py文件可以整个运行成功之后,在Anaconda Prompt
中打包,dist
文件中出来的exe大概 252M
,已经比base环境中小了很多,但是当我复制到另外一个电脑上时,程序只能运行到一半,只创建了一个文件夹,并没有输出图片,就自动关闭了,在运行成功的电脑上,弹出的窗口是不会自动关闭的。
然后抱着尝试的心态在同事们的电脑上都做了测试,2个可以运行,5个不能运行,后来发现应该是因为文件太大了。
之后用Pycharm的venv创建成功的exe只用 60M,实测都可以运行了。
3.2 Pycharm的venv
在查找资料的过程中,有文章提到可以用单独项目的venv来打包exe,因为pyinstaller会把它所在环境的所有库都打包进来,刚开始没有理解,后来发现用Anaconda的base环境打包出来的exe要 1个G …… 我就动心思了,但是因为我之前没有用过Pycharm,结果这条路走的并不顺畅,创建出来的可执行文件确实变小了很多,大概7MB左右,但是并不能用[捂脸]🤦不过为了给可执行文件减重,之后一定要找机会再试试!所以第一次测试成功还是用的Anaconda中的环境。
啊啊啊!!!
我成功啦!!!
在Anaconda中解决了4.1的问题后,同步应用到了Pycharm中,最终生成了一个只有60M
的工具,敲开心♥♥♥~~~
简单说一下操作步骤吧:
- 在Pycharm中创建新项目,使用新的环境。选择
Python Interpreter: New Virtualenv environment
,这里需要选择项目所在的文件夹,以及python.exe所在的文件夹,不然没法用。(像我一样找不到原来的可以重新安装一个python官方网站)
- 安装程序运行的依赖库,有两种方式:
2.1 在Setting
中直接查找添加
2.2 在界面下方Terminal
中通过pip
命令安装(不要忘了安装pyinstaller)
- 还是在界面下方的
Terminal
中,通过pyinstaller的命令打包程序
3.1 成功后,在运行该命令的文件夹下就会出现两个新的文件夹:dist
和build
,一个新文件pythonfilename.spec
.
3.2exe
就在dist文件夹中
4. exe运行问题
4.1 Failed to execute script…
查看了很多网页,都没有起作用,后来偶然我想着就随便创建一下,没有使用-w,在运行exe的时候闪过了报错信息,用视频录了下来,发现了一个RuntimeError: Could not find the matplotlib data files
搜索了这个报错信息后,发现了一篇文章3跟我遇到的问题一样,参考了他的方法(降低了Matplotlib的版本),具体操作在Anaconda Prompt
中:
# 先查看了一下自己matplotlib的版本
(your env) C:\user\user>pip list
(your env) C:\user\user>pip uninstall matplotlib
(your env) C:\user\user>pip install matplotlib==3.1.1
(your env) C:\user\user>pyinstaller -F pythonfilename.py
再运行exe,命令行窗口有warning信息,但是能够正常弹出我的exe界面了。这个warning不知道以后会不会有影响,反正现在的问题是解决了。
……\PyInstaller\loader\pyimod03_importers.py:623: MatplotlibDeprecationWarning:
The MATPLOTLIBDATA environment variable was deprecated in Matplotlib 3.1 and will be removed in 3.3.