如何让setuptools可编辑安装自动编译依赖的C库?
问题原因
从setuptools 64.0.0版本开始,可编辑安装默认采用PEP 660标准,不再触发传统的develop命令,因此你定义的CustomDevelop类完全不会被执行,这就是C库没编译的核心原因。
解决方案
提供两种可行方案,推荐使用方案二适配现代标准:
方案一:强制使用传统可编辑模式(快速兼容)
通过配置强制pip回到旧版develop命令流程:
- 在
pyproject.toml中添加以下配置:
[tool.setuptools.editable-mode] mode = "legacy"
- 修改
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:
- 在
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, # 新增注册 }, )
- 在
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
相关产品推荐
相关产品推荐

