记录踩到的 pyinstaller 打包 exe 的坑

2018-08-02 13:33:28 +08:00
 firejoke
需求:帮别人做一个统计 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
7404 次点击
所在节点    Python
26 条回复
ifoolish
2018-08-02 13:59:07 +08:00
格式好乱……一般大家都会写个博客记录一下
H0TSp1RnG
2018-08-02 14:05:31 +08:00
正好遇到一个打包的问题 我在 mac 环境下打包 但是目标运行环境是 win10 的 应该怎么弄
OpenJerry
2018-08-02 14:15:52 +08:00
@H0TSp1RnG 用 windows 虚拟机打包吧,pyinstaller 好像不能跨平台打包
firejoke
2018-08-02 14:37:52 +08:00
@ifoolish 最开始是 default 语法,预览的时候很好,发布后发现有一个写错了,就重新编辑了,结果就......
firejoke
2018-08-02 14:39:39 +08:00
@H0TSp1RnG 看你的依赖库有没有像我这样的会有依赖的 txt 之类的文档,如果有,
就按我的这个方法,亲测可以在 win10 运行
firejoke
2018-08-02 14:41:52 +08:00
@OpenJerry
@H0TSp1RnG 哦,对,你等等,我是分别在 Mac 和 win10 都打包测试过了,我试试 Mac 打包的放 win 可不可行
firejoke
2018-08-02 14:45:49 +08:00
@H0TSp1RnG
@OpenJerry
试了,不行,必须在 win10 系统打包
shootsoft
2018-08-02 15:05:00 +08:00
xyfan
2018-08-02 16:32:59 +08:00
Pyinstaller 真的是大坑,pyqt 写了一个很小的程序,用-w 打包运行的时候报错,不用-w,带命令行运行就没问题,怎么也解决不了。(不是 std i/o 问题)
OpenJerry
2018-08-02 17:11:16 +08:00
所以帮身边小伙伴做一些小工具的时候,我宁愿用 go 写
firejoke
2018-08-02 18:03:37 +08:00
@xyfan 可能和我一样, 是依赖包的路径寻址问题, 我觉得要想优雅而彻底的解决, 只能改资源搜索路径


@OpenJerry 别呀~python 这么优雅~


@shootsoft 有点厉害! 你是怎么解决依赖库的路径搜索问题的?
waterlaw
2018-08-02 19:40:24 +08:00
我也遇到这个问题哎,qm 文件不会帮我打包。
waterlaw
2018-08-02 19:41:34 +08:00
还是用 c ++ 比较好, 打包后体积小
shootsoft
2018-08-02 20:11:32 +08:00
@firejoke 貌似我没碰上复杂的依赖...
twistedmeadows
2018-08-02 20:21:42 +08:00
以为有什么高级经验。结果也是这种粗暴解法。
Python 就是这方面太不酷了,想跟小伙伴装个逼都装不了。
firejoke
2018-08-02 20:53:36 +08:00
@waterlaw 应该还有更全的打包方法,不行就只有修改源码了

@shootsoft 那也是幸运了~

@twistedmeadows 哈哈哈~看情况来的嘛,如果没有特别的依赖文件之类的,就可以连着 QT 界面一起打包啊,
做个小游戏、小工具什么的也不是不可以啊~
XxxxD
2018-08-02 21:21:24 +08:00
打包成 exe 会很大么?
weyou
2018-08-02 21:33:40 +08:00
@xyfan 可以试试在主文件开头设置 excepthook,将未知异常输出到文件来查看原因
firejoke
2018-08-02 21:36:39 +08:00
@XxxxD 连着环境一起打包成一个就会很大,可以用 UPX 压缩

@xyfan
@waterlaw
@twistedmeadows
各位,找到一个可以给打包添加路径的方法
http://ju.outofmemory.cn/entry/137370
weyou
2018-08-02 21:42:46 +08:00
@firejoke 打开 pyinstaller 生成的 spec 文件,你会发现有个搜索路径 pathex 可以设置,并且可以设置多个。

如果程序中有要运行时读取的文件( text,图片等非 import 的文件),pyinstaller 是找不到的,这时可以将路径放到 datas 列表中让 pyinstaller 打包进去,

其实这些 pyinstaller 自带的文档里都有明确的说明,楼主为什么不先读一遍呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/476247

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX