Python中使用pyinstaller打包exe常见问题与避坑指南
需求:帮别人做一个统计 pdf 文档内词频的功能
环境:python3.6
>Package Version
-------------- ---------
altgraph==0.16.1
atomicwrites==1.1.5
attrs==18.1.0
future==0.16.0
jieba==0.39
macholib==1.10
more-itertools==4.2.0
pdfminer3k==1.3.1
pefile==2017.11.5
pip==18.0
pluggy==0.7.1
ply==3.11
py==1.5.4
PyInstaller==3.3.1
pytest==3.7.0
setuptools==39.1.0
six==1.11.0
参考文档:
https://www.jianshu.com/p/5a59b6985346
https://www.crifan.com/use_pyinstaller_to_package_python_to_single_executable_exe
坑:
上述链接文档里,都是把环境和脚本打包成了一个 exe 文档
在脚本目录用命令 pyinstaller -F -p venv_path (中间一定要有空格) you.py
打包成一个文档后,报错在系统目录找不到 jieba 的 dict.txt
因为 jieba 会去找它自带的 dict.txt 文档
当你打包成一个文档的时候,貌似 pyinstaller 不会把你的 txt 文档打包进来,所以 jieba 回去系统目录去找,就会找不到,然后报错
想到的第一个解决办法是改搜索路径,嫌麻烦,不改…
第二个办法,既然不会打包 txt 文档,那我干脆不打包依赖库,只打包脚本,让它自己去搜索依赖
pyinstaller -p venv_path (中间一定要有空格) you.py
因为我需要黑终端输入路径,所以没有用 -w 参数
在 dist 文件夹生成了一个以脚本名命名的文件夹,包含一堆配置文档和一个 脚本名.exe
运行报错找不到当前目录下的 jieba
遂把 venv/lib/python3.6/site-packages/ 下的所有文件拷过来
双击成功 666
Python中使用pyinstaller打包exe常见问题与避坑指南
格式好乱……一般大家都会写个博客记录一下
帖子回复:
遇到pyinstaller打包的问题确实挺烦的,我整理了几个最常见的坑和解决方案:
1. 找不到模块/依赖 这是最常见的问题。pyinstaller默认只打包显式import的模块。
# 解决方案:在spec文件或命令行中明确指定隐藏导入
# 命令行方式:
pyinstaller --hidden-import=模块名 your_script.py
# 或者创建spec文件后修改:
a = Analysis(['your_script.py'],
hiddenimports=['pandas', 'numpy', '其他隐藏模块'],
...)
2. 资源文件丢失 如果你的程序需要图片、配置文件等资源:
# 方法1:使用--add-data参数
pyinstaller --add-data="资源路径;目标路径" your_script.py
# Windows用分号;,Linux/Mac用冒号:
# 方法2:代码中动态获取路径
import sys
import os
def resource_path(relative_path):
"""获取资源的绝对路径"""
if hasattr(sys, '_MEIPASS'):
# 打包后的临时目录
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
# 使用示例
icon_path = resource_path("icon.ico")
3. 多进程/多线程问题 使用multiprocessing时:
import multiprocessing
if __name__ == '__main__':
multiprocessing.freeze_support() # 必须加这行
# 你的多进程代码
4. 控制台窗口问题
# 不显示控制台窗口(GUI程序)
pyinstaller -w your_script.py
# 显示控制台窗口(需要看打印信息)
pyinstaller -c your_script.py
5. 版本兼容性问题 建议指定Python版本和pyinstaller版本:
# 使用虚拟环境确保环境干净
python -m venv venv
venv\Scripts\activate # Windows
pip install pyinstaller==5.13.0 # 指定稳定版本
打包建议流程:
- 先测试:
pyinstaller --onefile your_script.py - 有问题时用调试模式:
pyinstaller --debug your_script.py - 最终打包:
pyinstaller --onefile --clean --noconsole your_script.py
一句话总结: 仔细检查依赖,处理好资源路径,多进程记得加freeze_support。
正好遇到一个打包的问题 我在 mac 环境下打包 但是目标运行环境是 win10 的 应该怎么弄
用 windows 虚拟机打包吧,pyinstaller 好像不能跨平台打包
最开始是 default 语法,预览的时候很好,发布后发现有一个写错了,就重新编辑了,结果就…
看你的依赖库有没有像我这样的会有依赖的 txt 之类的文档,如果有,
就按我的这个方法,亲测可以在 win10 运行
哦,对,你等等,我是分别在 Mac 和 win10 都打包测试过了,我试试 Mac 打包的放 win 可不可行
试了,不行,必须在 win10 系统打包
所以帮身边小伙伴做一些小工具的时候,我宁愿用 go 写
可能和我一样, 是依赖包的路径寻址问题, 我觉得要想优雅而彻底的解决, 只能改资源搜索路径
别呀~python 这么优雅~
有点厉害! 你是怎么解决依赖库的路径搜索问题的?
我也遇到这个问题哎,qm 文件不会帮我打包。
还是用 c ++ 比较好, 打包后体积小
貌似我没碰上复杂的依赖…
以为有什么高级经验。结果也是这种粗暴解法。
Python 就是这方面太不酷了,想跟小伙伴装个逼都装不了。
应该还有更全的打包方法,不行就只有修改源码了
那也是幸运了~
哈哈哈~看情况来的嘛,如果没有特别的依赖文件之类的,就可以连着 QT 界面一起打包啊,
做个小游戏、小工具什么的也不是不可以啊~
打包成 exe 会很大么?
可以试试在主文件开头设置 excepthook,将未知异常输出到文件来查看原因
连着环境一起打包成一个就会很大,可以用 UPX 压缩
各位,找到一个可以给打包添加路径的方法
http://ju.outofmemory.cn/entry/137370
打开 pyinstaller 生成的 spec 文件,你会发现有个搜索路径 pathex 可以设置,并且可以设置多个。
如果程序中有要运行时读取的文件( text,图片等非 import 的文件),pyinstaller 是找不到的,这时可以将路径放到 datas 列表中让 pyinstaller 打包进去,
其实这些 pyinstaller 自带的文档里都有明确的说明,楼主为什么不先读一遍呢
因为他们只会用百度搜索中文博客看。
好好说话不会吗, 自卑感好点了吗
说的对,当时只想着可能是命令问题,一心去找别人的解决方法,没想到去看官方文档,
下次吸取教训, 我去试试能不能把 jieba 自带的 dict.txt 路径一起打进去
最后,结合官方文档 https://pyinstaller.readthedocs.io/en/v3.3.1/spec-files.html
把 jieba 模块下的所有 txt 文档在 .spec 文件内加进去
形式:
datas = [ (‘XXX.txt_path’, ‘jieba’ ),(‘analyse/XXX.txt_path’, ‘jieba/analyse’),(‘finalseg/XXX.p_path’,‘jieba/finalseg’),…]
(非.py 文档以路径 , 模块名), 或者(非.py , 模块名 /包名)
或者直接
datas = [ (‘ jieba’,‘jieba’ ) ]
这两个形式都可以
然后 pyinstaller name.spec 运行一下就 OK 了
好久没来了.上来学习下哈.


