如何让Bazel打包含PyBind11依赖的Python Wheel时包含.so文件
解决Bazel打包Wheel时.so文件未进入site-packages的问题
问题出在:你把.so作为py_library的data依赖,但直接让py_wheel依赖py_library时,Bazel不会自动将data文件放到site-packages对应的包目录下,需要通过py_package来规范包结构,确保共享库被正确收集并打包。
以下是具体修改方案:
1. 调整py_package配置
修改py_package,确保它能捕获到.so文件并维持正确的包结构:
py_package( name = "pyexample_pkg", visibility = ["//visibility:public"], deps = [":example"], # 显式声明包含data文件(默认已开启,写出来更稳妥) include_data_files = True, # 指定包的根目录,对应你的Python包结构 packages = ["."], )
2. 修改py_wheel的依赖目标
让py_wheel依赖py_package而非直接依赖py_library,这样py_package整理好的所有文件(包括.so)都会被正确打包进wheel:
py_wheel( name = "wheel", abi = "cp311", author = "me", distribution = "example", license = "Apache 2.0", platform = select({ "@bazel_tools//src/conditions:linux_x86_64": "linux_x86_64", }), python_requires = ">=3.9.0", python_tag = "cpython", version = "0.0.1", # 替换为py_package目标 deps = [":pyexample_pkg"], )
3. 可选但推荐:优化.so文件命名
将pybind_extension的名字改成符合Python模块导入规范的名称,比如你的example.py中如果是import _pyexample_inf,就修改目标名:
pybind_extension( name = "_pyexample_inf", srcs = ["pyexample_inf.cpp"], deps = [], linkstatic = True, )
同时同步更新py_library的data依赖:
py_library( name = "example", srcs = ["example.py", "__init__.py"], data = [":_pyexample_inf"], imports = ["."], )
验证修改效果
执行以下命令重新构建wheel并检查文件结构:
bazel build //:wheel # 查看wheel内的文件分布 unzip -l bazel-bin/wheel-0.0.1-cp311-cp311-linux_x86_64.whl
此时你应该能看到.so文件出现在example/目录下,安装后就会对应到site-packages的包路径中。
内容的提问来源于stack exchange,提问作者Mercury
相关产品推荐
相关产品推荐

