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

setup.py配置:Python打包wheel未包含共享库.so的解决方法

问题原因

setuptools 默认只会自动收集Python包目录下的.py源码文件,.so这类二进制产物不在默认打包范围内。你当前的setup.py没有显式声明需要包含共享库文件,因此最终生成的wheel包会漏掉mypack/sub_pack2/shared_library.so。

适配当前场景的解决方案

你现在是提前通过外部流程构建好so文件,只需要把现成产物打进wheel,直接修改setup.py添加package_data配置,显式指定子包内需要打包的非源码文件即可,修改后的完整配置如下:

from setuptools import setup, find_packages

setup(
    name = "mypack",
    version = "1.0",
    author = "Bill Coder",
    author_email = "bill.coder@email.com",
    description = "My Code",
    packages=find_packages(),
    package_data={
        # 指定mypack.sub_pack2包下所有后缀为.so的文件都要打包
        "mypack.sub_pack2": ["*.so"],
    },
    long_description="Long description",
)

注意事项:

  • 配置里的包名mypack.sub_pack2必须和实际目录名完全一致,你贴的文件结构里sub_pack2行末尾漏了路径斜杠,注意不要把目录名误写为subpack2之类的错误名称。
  • 重新构建前先清理旧的构建缓存,删除项目根目录下的build/、dist/、*.egg-info文件夹,避免旧缓存导致打包结果异常。

构建完成后可以用以下命令验证wheel包内是否包含目标文件:

unzip -l dist/mypack-1.0-*.whl | grep shared_library.so

命令输出如果存在mypack/sub_pack2/shared_library.so路径,就说明打包成功。

可选:集成Cython编译流程

如果后续你想省掉外部预编译so的步骤,直接在setup流程里完成cythonize编译+打包,可以把Cython扩展配置直接写进setup.py,参考配置如下:

from setuptools import setup, find_packages, Extension
from Cython.Build import cythonize

# 配置要编译的Cython扩展
ext_modules = cythonize([
    Extension(
        "mypack.sub_pack2.shared_library",
        ["mypack/sub_pack2/对应源码文件.pyx"]
    )
])

setup(
    name = "mypack",
    version = "1.0",
    author = "Bill Coder",
    author_email = "bill.coder@email.com",
    description = "My Code",
    packages=find_packages(),
    ext_modules=ext_modules,
    long_description="Long description",
)

用这个配置执行构建命令时,会自动完成pyx文件到so的编译,并且自动把生成的so纳入wheel包,不需要额外配置package_data,适合后续CI流程优化使用。


内容的提问来源于stack exchange,提问作者user422005

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:06:04