迁移至pyproject.toml后setup.py build_ext失效,如何读取配置?
解决pyproject.toml迁移后setup.py build_ext无法运行的问题
不用回退到旧的setup.py/*.cfg配置,有两种可行方案:
方案1:让setup.py主动读取pyproject.toml的配置
在setup.py中添加代码,手动读取pyproject.toml里的项目元数据(比如包名、版本号),补充setup()函数的必要参数。具体步骤:
- 如果你的Python版本低于3.11,先安装
tomli库:pip install tomli(Python3.11+自带tomllib,无需额外安装) - 修改setup.py,加入读取逻辑:
# 根据Python版本选择tomllib或tomli try: import tomllib except ImportError: import tomli as tomllib from setuptools import setup, Extension # 读取pyproject.toml中的项目配置 with open("pyproject.toml", "rb") as f: pyproject_data = tomllib.load(f) project_config = pyproject_data["project"] # 原有Cython扩展模块定义保持不变 ext_modules = [ Extension("your_module1", ["src/your_module1.pyx"]), Extension("your_module2", ["src/your_module2.pyx"]), ] # 用读取到的元数据配置setup setup( name=project_config["name"], version=project_config["version"], ext_modules=ext_modules )
这样修改后,python setup.py build_ext --inplace就能正常执行,因为setup.py已经获取到了必要的项目配置信息。
方案2:改用setuptools模块方式调用命令
无需修改setup.py,直接替换原来的命令为:
python -m setuptools build_ext --inplace
现代版本的setuptools(>=61.0.0)在以模块方式运行时,会自动读取pyproject.toml中的配置,再结合setup.py里的扩展模块定义完成编译。这种方式更简洁,也符合PEP 621的打包规范。
前置检查
确保你的setuptools和Cython是最新版本,避免版本兼容问题:
pip install --upgrade setuptools cython
内容的提问来源于stack exchange,提问作者Juergen
相关产品推荐
相关产品推荐

