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

是否应仅使用pyproject.toml?还是与setup.py、setup.cfg搭配使用?

关于Python项目配置文件的选择:pyproject.toml vs setup.py/setup.cfg

核心结论

现代Python项目优先选择纯pyproject.toml,仅在需要动态逻辑或兼容旧代码时搭配其他文件。


1. 大多数场景:只用pyproject.toml

PEP 621已经将pyproject.toml确立为Python项目元数据和构建配置的标准文件,它能覆盖绝大多数常规需求:

  • 定义项目元数据(名称、版本、作者、许可证等)
  • 声明依赖(运行时、开发时、可选依赖)
  • 设置脚本/入口点(比如命令行工具)
  • 指定构建后端(比如setuptools、poetry、flit)

示例片段:

[project]
name = "my-package"
version = "0.1.0"
authors = [{name = "Your Name", email = "your@email.com"}]
dependencies = ["requests>=2.25.0"]

[project.scripts]
my-cli = "my_package.cli:main"

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

这种方式完全是声明式的,清晰易读,没有执行代码的风险,是当前官方推荐的最佳实践。

2. 需要动态逻辑时:pyproject.toml + setup.py

如果你的项目需要动态生成配置或执行自定义逻辑,就需要保留setup.py:

  • 动态生成版本号(比如从Git标签自动获取)
  • 编译C/C++扩展模块
  • 安装过程中需要执行自定义操作(比如生成配置文件、下载额外资源)
  • 兼容一些仅支持setup.py的老工具

此时pyproject.toml负责指定构建后端和基础配置,setup.py处理动态部分。示例setup.py片段:

from setuptools import setup

def get_version():
    # 从Git标签或其他动态源获取版本
    return "0.1.0-dev"

setup(
    version=get_version(),
    # 其他动态配置项
)

3. 过渡/复杂配置场景:pyproject.toml + setup.cfg

如果你有一个用setup.cfg维护的旧项目,或者需要一些setuptools特有的复杂配置(比如精细的package_data规则),可以逐步将元数据迁移到pyproject.toml,同时保留setup.cfg处理剩余的setuptools专属配置。不过随着setuptools对pyproject.toml的支持越来越完善,这种场景会越来越少。

4. 不推荐的方式

  • 单独使用setup.py:不符合现代打包标准,缺少build isolation的配置,容易导致构建环境问题。
  • 单独使用setup.cfg:同样需要pyproject.toml来指定构建后端,否则无法正常构建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:49:01