You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:20:05