这个错误是在使用 PyInstaller 打包包含 pandas 的 Python 脚本时出现的 NumPy 导入问题。错误信息表明 NumPy 无法从源代码目录导入,这通常是因为 PyInstaller 没有正确打包 NumPy 依赖项。
首先确保您使用的是最新版本的 PyInstaller 和 NumPy:
# 激活您的 Conda 环境conda activate 您的环境名# 更新 PyInstaller 和 NumPypip install --upgrade pyinstaller numpy pandas
NumPy 需要特殊的处理才能在 PyInstaller 中正确工作。创建一个钩子文件来确保 NumPy 正确打包:
创建一个名为 hook-numpy.py 的文件,内容如下:
from PyInstaller.utils.hooks import collect_alldef hook(hook_api): packages = ['numpy'] for package in packages: datas, binaries, hiddenimports = collect_all(package) hook_api.add_datas(datas) hook_api.add_binaries(binaries) hook_api.add_imports(*hiddenimports)
将钩子文件放在 PyInstaller 的钩子目录中,或者使用 --additional-hooks-dir 参数指定它的位置。
尝试使用以下命令重新打包您的应用程序:
pyinstaller --onefile --hidden-import numpy --hidden-import pandas --additional-hooks-dir=/path/to/hooks process_excel.py
或者更详细的命令:
pyinstaller \ --onefile \ --name "YourAppName" \ --hidden-import numpy \ --hidden-import pandas._libs.tslibs.timedeltas \ --hidden-import pandas._libs.tslibs.np_datetime \ --hidden-import pandas._libs.tslibs.base \ --hidden-import pytz \ --additional-hooks-dir=/path/to/hooks \ process_excel.py
确保您使用的是 Conda 环境中的 PyInstaller,而不是系统全局的:
# 激活环境conda activate 您的环境名# 确保在环境中安装了 PyInstallerconda install pyinstaller# 然后运行打包命令pyinstaller --onefile process_excel.py
如果 PyInstaller 仍然有问题,可以考虑使用 Conda 的打包工具:
# 安装 conda-buildconda install conda-build# 创建一个构建脚本
确保 NumPy 正确安装在您的 Conda 环境中:
# 激活环境conda activate 您的环境名# 检查 NumPy 是否可导入python -c "import numpy; print(numpy.__version__)"# 重新安装 NumPyconda install -c conda-forge numpy
创建一个 spec 文件来更精细地控制打包过程:
首先生成一个 spec 文件:
pyi-makespec process_excel.py
编辑生成的 process_excel.spec 文件,在 Analysis 部分添加隐藏导入:
a = Analysis(['process_excel.py'], pathex=['/path/to/your/project'], binaries=[], datas=[], hiddenimports=['numpy', 'pandas'], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False)
然后使用 spec 文件进行打包:
pyinstaller process_excel.spec
使用虚拟环境:始终在虚拟环境或 Conda 环境中开发和打包应用程序
测试导入:在打包前,确保所有依赖项都能正确导入
逐步添加依赖:如果应用程序很复杂,逐步添加依赖项并测试打包过程
如果以上方法都不能解决问题,可能需要考虑使用其他打包工具,如 cx_Freeze 或 py2exe(仅限 Windows),或者将应用程序部署为 Docker 容器。