如何配置py2exe打包jsonschema依赖的资源文件?
解决py2exe打包含jsonschema项目时缺失schema文件的问题
在使用py2exe打包依赖jsonschema的Python项目时,常会遇到KeyError: 'jsonschema/schemas/draft3.json'这类错误,原因是py2exe默认未收集jsonschema的schema资源文件。以下是针对新版py2exe的几种有效解决方案:
方法一:显式配置package_data
在setup.py中直接声明jsonschema的资源文件,让py2exe识别并打包:
from setuptools import setup import py2exe setup( name="YourProject", version="1.0", console=["main.py"], # 替换为你的入口脚本 options={ "py2exe": { "packages": ["jsonschema"], } }, package_data={ "jsonschema": ["schemas/*.json"] } )
该方式利用setuptools的package_data机制,明确告知py2exe需要包含jsonschema下schemas目录的所有json文件。
方法二:手动指定data_files
通过手动定位jsonschema的schemas目录,将文件添加到data_files中,确保打包后目录结构与原包一致:
from setuptools import setup import py2exe import os import jsonschema # 获取jsonschema的安装路径及schemas目录 jsonschema_root = os.path.dirname(jsonschema.__file__) schemas_dir = os.path.join(jsonschema_root, "schemas") # 收集所有schema文件,保持目录结构 schema_files = [ (os.path.join("jsonschema", "schemas"), [os.path.join(schemas_dir, f) for f in os.listdir(schemas_dir) if f.endswith(".json")]) ] setup( name="YourProject", version="1.0", console=["main.py"], options={ "py2exe": { "packages": ["jsonschema"], } }, data_files=schema_files )
这种方法适合package_data配置不生效的场景,强制将资源文件复制到对应路径。
方法三:使用py2exe自定义hook
创建py2exe的hook文件来自动收集jsonschema的资源:
- 在项目根目录创建
hook-jsonschema.py:
from py2exe.hooks import collect_data_files def hook(mod): # 收集jsonschema/schemas下的所有文件 mod.datas.extend(collect_data_files("jsonschema", subdir="schemas")) return mod
- 在
setup.py中指定该hook:
from setuptools import setup import py2exe setup( name="YourProject", version="1.0", console=["main.py"], options={ "py2exe": { "packages": ["jsonschema"], "hooks": ["hook-jsonschema.py"] } } )
hook机制是py2exe的扩展方式,适合需要批量处理多个包资源的场景。
验证方法
打包完成后,检查dist目录下是否存在jsonschema/schemas/目录及对应的json文件,若存在则说明配置生效,运行exe即可解决KeyError问题。
内容的提问来源于stack exchange,提问作者freebie
相关产品推荐
相关产品推荐

