PyInstaller已加载pandas hook但生成exe运行时导入pandas失败求助
解决PyInstaller打包pandas时tslib模块缺失的问题
我之前在Python 2.7环境下用PyInstaller打包pandas脚本时也碰到过几乎一模一样的问题,结合你的环境版本(Python2.7 + PyInstaller3.3.1 + pandas0.22.0),问题根源在于旧版本PyInstaller的pandas hook没有正确处理pandas 0.22.0中的C扩展依赖(比如tslib)——哪怕日志显示hook已经加载,也不代表它能覆盖所有需要的模块。下面是几个可行的解决方案:
方案1:修复或替换hook-pandas.py文件
你手动添加的hook可能版本不匹配pandas 0.22.0,建议替换成适配的hook内容:
- 找到你PyInstaller hooks目录(
Python27\Lib\site-packages\PyInstaller\hooks)里的hook-pandas.py - 替换为以下内容:
from PyInstaller.utils.hooks import collect_data_files, collect_submodules, collect_dynamic_libs # 收集pandas的数据文件和子模块 datas = collect_data_files('pandas') hiddenimports = collect_submodules('pandas') # 显式添加tslib等关键C扩展模块 hiddenimports += ['pandas._libs.tslib', 'pandas._libs.algos', 'pandas._libs.hashtable', 'pandas._libs.index'] # 收集pandas的动态库文件 binaries = collect_dynamic_libs('pandas')
- 保存后重新运行PyInstaller打包命令。
方案2:修改spec文件手动添加依赖
如果修改hook没用,直接在spec文件里强制添加缺失的依赖:
- 先生成spec文件:
pyi-makespec myProgram.py - 打开生成的
myProgram.spec,修改Analysis部分的参数:
from PyInstaller.utils.hooks import collect_data_files, collect_submodules a = Analysis(['myProgram.py'], pathex=['你的脚本所在路径'], binaries=[], datas=collect_data_files('pandas'), hiddenimports=collect_submodules('pandas') + ['pandas._libs.tslib'], hookspath=None, runtime_hooks=None, excludes=None, win_no_prefer_redirects=False, win_private_assemblies=False, cipher=None, noarchive=False)
- 用spec文件打包:
pyinstaller myProgram.spec
方案3:调整版本兼容性
PyInstaller3.3.1是比较老的版本,对pandas0.22.0的支持不够完善,你可以尝试:
- 升级PyInstaller到3.6(这是支持Python2.7的最后一个PyInstaller版本),然后重新打包;
- 或者降级pandas到0.20.3,这个版本的C扩展结构更简单,旧版PyInstaller更容易处理。
方案4:手动复制缺失的C扩展文件
如果以上方案都没效果,可以手动补上缺失的文件:
- 找到你的Python环境中pandas的安装目录,比如
Python27\Lib\site-packages\pandas\_libs - 找到
_tslib.pyd文件(Windows下的C扩展二进制文件) - 复制这个文件到打包生成的
dist\myProgram\pandas\_libs目录下 - 再次运行exe文件试试
为什么加载了hook还是报错?
PyInstaller的hook机制是按模块名加载对应的处理逻辑,但旧版的hook-pandas.py并没有包含对pandas 0.22.0新增或调整的C扩展模块(比如tslib)的处理,所以哪怕日志显示hook加载了,也无法自动收集这些依赖,导致运行时找不到模块。
内容的提问来源于stack exchange,提问作者lptsn
相关产品推荐
相关产品推荐

