Python – 别再问我怎么Python打包成exe了!

年前这几天,刚好稍微有点空闲,无需拜访客户,故赶紧抓紧时间,解决同事每天生成报表的事宜,虽然前期和同事沟通过好几次,就是完成报表的思路,但一直没有完成客户及客户经理关系表,故一直没法写。其实也是我比较忙。

先前这个报表我是通过Excel VBA帮同事生成的,但由于现在增加了客户经理共同开发客户的情况,所以原来的VBA代码已经没办法完成了。于是我面临了2个选择:

  • 继续修改VBA代码,增加新功能
  • 使用Python重新编写

为啥会有想使用Python来编写,其实Python以前写过很多RPA、爬虫等,但是没有生成过报表。其次就是VBA虽然集成在Excel中,但其编写的代码比较冗长,而且处理数据也比较繁琐,故才考虑使用Python。

经过了一番思索,最终还是考虑使用Python,经过周末2天的编写,自动生成代码终于完成了,但是弊端马上就出来了,以前通过VBA来写,发给同事.xlsm文件即可,客户打开该文件即可选择需要处理的文件夹,生成后存入.xlsm文件中即可。但Python编写完成是一个.py文件,该文件需要同事电脑安装Python编程环境,这个也太不方便了,而且还有很多包需要安装。

为了解决这个问题,于是通过网上搜索,可以通过Pyinstaller或py2exe可以解决,但我发现Pyinstaller的教程更多,我学起来更快,于是就这么草率的选择了Pyinstaller。对不住了py2exe,等后面有机会我再研究一下你。

Python - 别再问我怎么Python打包成exe了!

PS: 如果打包为exe的话,版本尽量选择python3.6+32位版本,因为win64位系统向下兼容32位程序,但是如果不考虑32位系统的话无所谓,直接python64位版本直接打包就可以,只是只能在win64位系统上跑。

一、安装Pyinstaller

首先安装pyinstaller,使用安装命令:pip3 install pyinstaller,如下图所示。

Python - 别再问我怎么Python打包成exe了!

为啥我会在一个虚拟解释器中安装呢,因为这就涉及到Pyinstaller打包机制了。

二、Pyinstaller打包机制

我们写的python脚本是不能脱离python解释器单独运行的,所以在打包的时候,至少会将python解释器和脚本一起打包,同样,为了打包的exe能正常运行,会把我们所有安装的第三方包一并打包到exe。

即使我们的项目只使用的一个requests包,但是可能我们还安装了其他n个包,但是他不管,因为包和包只有依赖关系的。比如我们只装了一个requests包,但是requests包会顺带装了一些其他依赖的小包,所以为了安全,只能将所有第三方包+python解释器一起打包。

(venv) C:\Users\Steven\Desktop\Python线下教学\04 实际案例\06 根据现有表格,自动生成报表>pip3 list
Package                   Version
------------------------- ---------
altgraph                  0.17
et-xmlfile                1.0.1
future                    0.18.2
jdcal                     1.4.1
numpy                     1.20.1
openpyxl                  3.0.6
pandas                    1.2.2
pefile                    2019.4.18
pip                       21.0.1
pyinstaller               4.2
pyinstaller-hooks-contrib 2020.11
python-dateutil           2.8.1
pytz                      2021.1
pywin32                   300
pywin32-ctypes            0.2.0
setuptools                53.0.0
six                       1.15.0
xlrd                      2.0.1
xlwings                   0.22.2

(venv) C:\Users\Steven\Desktop\Python线下教学\04 实际案例\06 根据现有表格,自动生成报表>pip install requests
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting requests
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/29/c1/24814557f1d22c56d50280771a17307e6bf87b70727d975fd6b2ce6b014a/requests-2.25.1-py2.py3-none-any.whl (61 kB)
     |████████████████████████████████| 61 kB 1.3 MB/s
Collecting idna<3,>=2.5
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl (58 kB)
     |████████████████████████████████| 58 kB 2.9 MB/s
Collecting urllib3<1.27,>=1.21.1
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/23/fc/8a49991f7905261f9ca9df5aa9b58363c3c821ce3e7f671895442b7100f2/urllib3-1.26.3-py2.py3-none-any.whl (137 kB)
     |████████████████████████████████| 137 kB 3.3 MB/s
Collecting chardet<5,>=3.0.2
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/19/c7/fa589626997dd07bd87d9269342ccb74b1720384a4d739a1872bd84fbe68/chardet-4.0.0-py2.py3-none-any.whl (178 kB)
     |████████████████████████████████| 178 kB ...
Collecting certifi>=2017.4.17
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/5e/a0/5f06e1e1d463903cf0c0eebeb751791119ed7a4b3737fdc9a77f1cdfb51f/certifi-2020.12.5-py2.py3-none-any.whl (147 kB)
     |████████████████████████████████| 147 kB 3.3 MB/s
Installing collected packages: urllib3, idna, chardet, certifi, requests
Successfully installed certifi-2020.12.5 chardet-4.0.0 idna-2.10 requests-2.25.1 urllib3-1.26.3

(venv) C:\Users\Steven\Desktop\Python线下教学\04 实际案例\06 根据现有表格,自动生成报表>pip3 list
Package                   Version
------------------------- ---------
altgraph                  0.17
certifi                   2020.12.5
chardet                   4.0.0
et-xmlfile                1.0.1
future                    0.18.2
idna                      2.10
jdcal                     1.4.1
numpy                     1.20.1
openpyxl                  3.0.6
pandas                    1.2.2
pefile                    2019.4.18
pip                       21.0.1
pyinstaller               4.2
pyinstaller-hooks-contrib 2020.11
python-dateutil           2.8.1
pytz                      2021.1
pywin32                   300
pywin32-ctypes            0.2.0
requests                  2.25.1
setuptools                53.0.0
six                       1.15.0
urllib3                   1.26.3
xlrd                      2.0.1
xlwings                   0.22.2

(venv) C:\Users\Steven\Desktop\Python线下教学\04 实际案例\06 根据现有表格,自动生成报表>

比较了一下,安装了requests后,也新增了certifi、chardet、idna、urllib3这几个包。

三、Pyinstaller打包exe

Pyinstaller -F setup.py # 打包exe,-F参数表示覆盖打包,这样在打包时,不管我们打包几次,都是最新的
Pyinstaller -F -w setup.py # 不带控制台的打包
Pyinstaller -F -i xx.ico setup.py # 打包指定exe图标打包,例如:Pyinstaller -F -i sut.ico analysis-bak.py

我这里就是通过上面第三个命令来进行打包的,打包过程中也有中文路径,有没有发现任何奇怪问题。顿时感觉Pyinstaller的强大。

(venv) C:\Users\Steven\Desktop\Python线下教学\04 实际案例\06 根据现有表格,自动生成报表>Pyinstaller -F -i sut.ico analysis.py
46 INFO: PyInstaller: 4.2
46 INFO: Python: 3.9.0
46 INFO: Platform: Windows-10-10.0.19041-SP0
46 INFO: wrote C:\Users\Steven\Desktop\Python线下教学\04 实际案例\06 根据现有表格,自动生成报表\analysis.spec
46 INFO: UPX is not available.
62 INFO: Extending PYTHONPATH with paths
['C:\\Users\\Steven\\Desktop\\Python线下教学\\04 实际案例\\06 根据现有表格,自动生成报表',
 'C:\\Users\\Steven\\Desktop\\Python线下教学\\04 实际案例\\06 根据现有表格,自动生成报表']
62 INFO: checking Analysis
62 INFO: Building Analysis because Analysis-00.toc is non existent
62 INFO: Initializing module dependency graph...
62 INFO: Caching module graph hooks...
78 WARNING: Several hooks defined for module 'win32ctypes.core'. Please take care they do not conflict.
78 INFO: Analyzing base_library.zip ...
2202 INFO: Processing pre-find module path hook distutils from 'c:\\users\\steven\\desktop\\python线下教学\\04 实际案例\\venv\\lib\\site-packages\\PyInstaller\\hoo
ks\\pre_find_module_path\\hook-distutils.py'.
2202 INFO: distutils: retargeting to non-venv dir 'C:\\Python\\Python3\\lib'
3874 INFO: Caching module dependency graph...
3952 INFO: running Analysis Analysis-00.toc
……此处省略很多、很多……
18236 INFO: checking PKG
18236 INFO: Building PKG because PKG-00.toc is non existent
18236 INFO: Building PKG (CArchive) PKG-00.pkg
29603 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
29634 INFO: Bootloader c:\users\steven\desktop\python线下教学\04 实际案例\venv\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
29634 INFO: checking EXE
29634 INFO: Building EXE because EXE-00.toc is non existent
29634 INFO: Building EXE from EXE-00.toc
29634 INFO: Copying icons from ['sut.ico']
29634 INFO: Writing RT_GROUP_ICON 0 resource with 20 bytes
29634 INFO: Writing RT_ICON 1 resource with 67624 bytes
29665 INFO: Updating manifest in C:\Users\Steven\Desktop\Python线下教学\04 实际案例\06 根据现有表格,自动生成报表\build\analysis\run.exe.vvk4k76n
29665 INFO: Updating resource type 24 name 1 language 0
29697 INFO: Appending archive to EXE C:\Users\Steven\Desktop\Python线下教学\04 实际案例\06 根据现有表格,自动生成报表\dist\analysis.exe
29712 INFO: Building EXE from EXE-00.toc completed successfully.

PS:之前在另一台电脑上打包,我使用错了虚拟解释器环境,导致打包出现各类缺少包的错误,还有一些其他奇葩错误,导致第一次使用Pyinstaller打包py文件并不是特别顺畅。吸取了第一次失败的教训,这一次直接使用虚拟环境进行打包,一次性打包成功,没有任何出错,打包运行的exe也能正常运行。

Python - 别再问我怎么Python打包成exe了!
Python - 别再问我怎么Python打包成exe了!

虽然说上面打包好了一个exe文件,但也不能保证这个exe就一定能够运行,发送给同事之前,一定要自己测试一下哈。第一次打包的时候,经过九九八十一难,终于打包成exe文件了,一运行,一个黑框一闪而过,只留我一人在风中凌乱。经过飞快的截图才抓到了错误,最终在谷歌的帮助下成功打包并运行。

Python - 别再问我怎么Python打包成exe了!

最后一点让我惊喜的是,之前打包后的exe文件有70M+,这一次打包后文件只有34M+,虽然我知道打包后的exe会比较大,但这次打包的大小还是给了我惊喜。大家如果在打包过程中遇到相关问题,欢迎交流学习^_^

原创文章,作者:Steven,如若转载,请注明出处:https://www.saveutime.net/pyinstaller.html

发表评论

登录后才能评论