0 前言
对于程序员来说用IDE写程序,调程序,但是,如果将自己的写好的工具给别人使用的时候,总不能也要别人先装个python环境吧。去年写了一个批量发送邮件的小工具,就是pyinstaller打包成exe文件给别人使用的,现在因为需要再用,又碰到了一些问题,在此一并记录。
本文环境:
奉上PyInstaller官网传送门:http://www.pyinstaller.org/
1. 版本问题(系统&环境)
- 首先,在使用
pip installer pyinstaller
时,python 2和python 3的环境是不一样的,其次,最新的python 3.7也不支持pyinstaller(2019年初时); - 在Windows 64位系统下打包的程序,无法在32位系统上运行,至于在32位机器打包的能不能在64位通用我就不知道了,没试(没机会)。
2. 提示ImportError: C extension: No module named ‘pandas._libs.tslibs.timedeltas’
- 原因:在程序中使用了Pandas库,打包正常进行,完成后运行exe文件就提示这样的错误;
- 解决1:
-修改原有的打包代码为:
pyinstaller -F -w -i xxx.ico yyy.py --hidden-import=pandas._libs.tslibs.timedeltas
-F 指只生成一个exe文件,不生成其他dll文件
-w 不弹出命令行窗口
-i 设定程序图标 ,其后面的ico文件就是程序图标
yyy.py 就是要打包的程序
–hidden-import=pandas._libs.tslibs.timedeltas 隐藏相关模块的引用
参考来源:No module named ‘pandas._libs.tslibs.timedeltas’ in PyInstaller
3. 提示:struct.error:unpack requires a buffer of 16 bytes
在用上面解决方法1打包的时候,接着又出现了这样一个错误,行吧,接着干吧!
- 原因:可能是使用图标的格式/版本不兼容
- 解决1:不加图标,仅仅用下面这句:
pyinstaller -F yyy.py --hidden-import=pandas._libs.tslibs.timedeltas
搞定!
参考来源:python练习:科赫小雪花包裹
下面是无意中碰到或者看到的问题,也顺便找了一下解决办法,在此记录一下吧
4. 提示recursionError: maximum recursion depth exceeded
- 原因:可能是程序中的循环遍历啥的,太深了
- 解决1:在提示错误以后,会在目录下生成一个
XXX.spec
文件,这个xxx就是你要打包的python文件,然后打开该 xxx.spec文件,加入两行,如下:
# -*- mode: python -*-
import sys
sys.setrecursionlimit(5000)
5. 打包过程中控制台显示Warning: One binary added with two internal names
- 原因:暂未探究
- 解决:暂未探究