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

如何让setuptools可编辑安装自动编译依赖的C库?

问题原因

从setuptools 64.0.0版本开始,可编辑安装默认采用PEP 660标准,不再触发传统的develop命令,因此你定义的CustomDevelop类完全不会被执行,这就是C库没编译的核心原因。

解决方案

提供两种可行方案,推荐使用方案二适配现代标准:

方案一:强制使用传统可编辑模式(快速兼容)

通过配置强制pip回到旧版develop命令流程:

  1. 在pyproject.toml中添加以下配置:
[tool.setuptools.editable-mode]
mode = "legacy"
  1. 修改setup.py中的CustomDevelop类,编译后将C库复制到Python包目录(确保可编辑安装时Python能找到库):
class CustomDevelop(develop):
    def run(self):
        print("\nCustomDevelop!\n")
        remove_binaries()
        create_binaries()
        # 将编译好的C库复制到Python包目录
        mylib_lib = mylib_root / "adslib.so"
        package_lib_dir = Path(__file__).parent / "src" / "mypackage"
        self.copy_file(str(mylib_lib), str(package_lib_dir))
        super().run()

方案二:适配PEP 660可编辑安装(推荐)

实现PEP 660标准的build_editable钩子,兼容新版setuptools:

  1. 在setup.py中导入并实现CustomBuildEditable类:
from setuptools.command.build_editable import build_editable

# ... 保留原有代码 ...

class CustomBuildEditable(build_editable):
    def run(self):
        print("\nCustomBuildEditable!\n")
        remove_binaries()
        create_binaries()
        # 将编译好的C库复制到Python包目录
        mylib_lib = mylib_root / "adslib.so"
        package_lib_dir = Path(__file__).parent / "src" / "mypackage"
        self.copy_file(str(mylib_lib), str(package_lib_dir))
        super().run()

# ... 保留原有代码 ...

setup(
    cmdclass={
        "build": CustomBuild,
        "develop": CustomDevelop,
        "install": CustomInstall,
        "build_editable": CustomBuildEditable,  # 新增注册
    },
)
  1. 在pyproject.toml中配置包数据,确保C库被识别为包资源:
[tool.setuptools]
packages = ["mypackage"]
package-dir = { "" = "src" }
package-data = { "mypackage": ["*.so"] }  # 新增配置
额外优化建议

将subprocess.call替换为subprocess.check_call,确保编译出错时立即终止流程,方便调试:

def create_binaries():
    subprocess.check_call(["make", "-C", mylib_relative])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:52:08