PyInstaller打包Pydantic v2报错:`pydantic:compiled`已移除问题咨询
PyInstaller适配Pydantic v2问题解决方案
问题确认
你遇到的报错确实是PyInstaller官方钩子未适配Pydantic v2导致的——钩子文件hook-pydantic.py中仍保留了针对Pydantic v1的pydantic:compiled相关逻辑,而该特性在v2中已被移除。
临时解决办法
1. 升级依赖包
先尝试更新到最新版的PyInstaller和钩子库,后续版本可能已修复适配问题:
pip install --upgrade pyinstaller pyinstaller-hooks-contrib
更新完成后重新执行打包命令,验证是否解决问题。
2. 修改钩子文件
如果升级后仍报错,手动修改报错提示中的hook-pydantic.py文件:
- 定位到路径
C:\paul\AmDesp\venv\Lib\site-packages\_pyinstaller_hooks_contrib\hooks\stdhooks\hook-pydantic.py - 打开文件,搜索包含
compiled的代码段(比如尝试导入pydantic.compiled或检查pydantic:compiled配置的部分) - 将这部分代码注释或删除,保存后重新打包。
3. 打包时排除无效模块
在打包命令中添加参数,强制排除不存在的模块:
pyinstaller --exclude-module pydantic.compiled your_script.py
参与适配开发的方向
核心修复点是给hook-pydantic.py添加版本区分逻辑:
- 在钩子代码开头加入Pydantic版本检测,判断当前版本是否为v2及以上
- 针对v2版本,跳过所有和
pydantic.compiled相关的导入、检查逻辑 - 遵循PyInstaller钩子编写规范,确保修改同时兼容v1和v2版本
入门步骤:
- 查阅PyInstaller钩子的官方编写规范(仓库内说明或本地文档)
- 梳理
hook-pydantic.py中现有和compiled相关的逻辑 - 添加版本判断代码,示例如下:
import pydantic from packaging.version import Version if Version(pydantic.__version__) >= Version("2.0"): # 跳过v2中不存在的compiled相关逻辑 pass else: # 保留原v1的处理逻辑 ...
- 测试修改后的钩子对v1、v2版本的兼容性,之后提交修复PR。
替代构建工具
如果暂时不想折腾适配,可以尝试:
- Nuitka:将Python代码编译为C级可执行文件,对Pydantic v2支持较好
- cx_Freeze:配置简单的打包工具,对新库的适配速度较快
内容的提问来源于stack exchange,提问作者prosody
相关产品推荐
相关产品推荐

