Python3打包成windows的exe可执行程序

首先,Python打包成exe就是个大坑。

最近在做一些小程序,想着分享给一些朋友用用,就想到了打包程序。结果不看不知道,一看原来这东西是个深渊。
使用的是Pyinstaller 3.6/Python 3.8.3环境进行的编译打包。
新版本的Pyinstaller虽然支持了Python3,但是依旧有遗留下来的问题。打包后程序运行后会提示未找到模块。

1
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'

这个模块照着pkg_resources源码一搜发现,在它的__init__.py里面import了这个模块,而且这个模块本身的内容就是一个逻辑判断,看你是不是使用了Python2,如果是就报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys
import warnings
import textwrap


msg = textwrap.dedent("""
Encountered a version of Setuptools that no longer supports
this version of Python. Please head to
https://bit.ly/setuptools-py2-sunset for support.
""")

pre = "Setuptools no longer works on Python 2\n"

if sys.version_info < (3,):
warnings.warn(pre + "*" * 60 + msg + "*" * 60)
raise SystemExit(32)

不知道是哪里的咖喱代码导致这个模块无法导入,总之其中一个解决方法就是直接在__init__.py里面注释掉py2_warn这个import。
另一个方法是在打包的根目录中找到.spec,里面的hiddenimports加上’pkg_resources.py2_warn’,即手动import模块,之后再对.spec进行打包操作即可。