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

迁移至uv后,如何构建并打包CFFI扩展进Python Wheel?

解决pyreaddbc迁移uv包管理的配置问题

针对你遇到的两个问题,以下是具体的配置修正方案:

一、让构建脚本自动运行的配置调整

uv 遵循PEP 621标准,需确保pyproject.toml的构建系统配置正确关联CFFI的编译流程:

  1. 规范build-system段配置
    确保构建依赖包含setuptools、wheel和cffi,并使用setuptools作为构建后端(CFFI扩展编译依赖setuptools的构建流程):

    [build-system]
    requires = ["setuptools>=61.0", "wheel", "cffi>=1.0.0"]
    build-backend = "setuptools.build_meta"
    
  2. 自动触发CFFI编译(替代手动构建脚本)
    无需单独写构建脚本,直接在pyproject.toml中配置CFFI模块,uv构建时会自动调用cffi编译扩展:

    [tool.cffi]
    modules = [
        { name = "_readdbc", sources = ["src/_readdbc.c", "src/readdbc.c"] },  # 替换为你的实际源码文件路径
    ]
    

    如果你坚持使用自定义构建脚本(如setup.py),需确保setup.py中包含CFFI的编译逻辑(如ffi.compile()),且build-system的build-backend保持为setuptools.build_meta,uv会自动执行setup.py中的构建逻辑。

二、确保_readdbc.so被打包进wheel

如果是手动编译的.so文件,需显式告知setuptools将其纳入包资源:

  1. 配置package-data
    在pyproject.toml中添加tool.setuptools相关配置,指定目标包要包含的.so文件:

    [tool.setuptools]
    package-dir = {"" = "src"}  # 假设你的包源码在src目录下
    packages = ["pyreaddbc"]     # 替换为你的包名
    
    [tool.setuptools.package-data]
    pyreaddbc = ["*.so"]         # 匹配包目录下所有.so文件
    
  2. 备选:使用MANIFEST.in
    在项目根目录创建MANIFEST.in文件,写入以下内容(路径需匹配你的.so实际位置):

    include src/pyreaddbc/_readdbc.so
    

    setuptools会读取该文件,将指定文件包含进构建产物。

注意:如果使用CFFI自动编译扩展,生成的.so会被自动识别为扩展模块并打包,无需手动配置package-data。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:29:55