【问题标题】:Is there a reason to have both tox.ini and setup.cfg in a python project?是否有理由在 python 项目中同时拥有 tox.ini 和 setup.cfg ?
【发布时间】:2021-04-14 19:47:57
【问题描述】:

我刚刚使用 PyScaffold 搭建了一个 python 项目。引起我注意的一件事是脚手架同时生成了 setup.cfg 和 tox.ini 文件。如果我的理解是正确的,如果我使用 tox 命令使用 tox,它只会查看 tox.ini 文件并完全忽略 setup.cfg 和 setup.py。

在这种情况下,我的问题是:是否有理由将它们都保留在项目中,或者仅使用 tox.ini 或 setup.cfg 就足够了?如果我必须将它们都保留在我的项目中,是否有一种简单的方法可以使它们都使用相同的配置(例如,运行 flake8 以进行 linting 的配置),而无需我在 setup.cfg 和 tox 中键入这些配置。是吗?

【问题讨论】:

  • setup.cfg/setup.py 用于setuptoolstox.ini 用于 tox。不同的工具,不同的配置。
  • 我得到的那部分 - 我想我间接想问的是我是否需要 tox 和 setuptools - 在我未经训练的眼睛看来,它们似乎在做非常相似的事情
  • 我没有看到任何相似之处。 setup.cfg/setup.py 用于构建发行版,tox.ini 用于在动态创建的虚拟环境中运行测试; tox 当然是使用setuptools 构建一个发行版,并在运行测试之前将其安装到这些虚拟环境中。
  • 啊,那是缺少的链接 - 我以为它们都用于构建和测试 - 感谢您的澄清!

标签: setuptools tox pyscaffold


【解决方案1】:

让我们一步一步来。

PyScaffold 是一个试图简化新 Python 项目设置的工具。

什么是 Python 项目?

本质上,一个可执行的 Python 文件就足够了。

如果要使项目可安装,则需要构建系统的配置文件。

虽然随着时间的推移发生了很多变化,但setup.py 仍然是最突出的。在某个时间点发现,构建配置文件可以执行任意代码可能不是一个好主意,因此发明了setup.cfg,您可以在其中定义例如ini 样式格式的项目名称和依赖项。与此同时,发明了另一种格式,pyproject.toml 文件。

所以基本上,要构建您的项目,您需要其中之一:

  • setup.py
  • setup.py 和 setup.cfg(前者只调用后者)
  • pyproject.toml

通常您想为您的项目编写测试。你可以使用内置的unittest testrunner 来运行你的测试,或者现在很多项目使用pytestpytest 可以配置为pytest.ini

测试通常需要一些依赖,例如pytest 本身,也许还有其他一些测试助手。它们需要在某个时间安装。

tox 开始发挥作用了。在许多其他功能中,例如针对不同的 Python 版本运行您的测试,tox 可以安装您的项目和您的测试需求并执行测试。 tox 通常带有 tox.ini 文件。

哦,棉绒呢?您希望拥有易于阅读的代码并遵循 Python 指南(例如 PEP 8),因此您通常使用像 flake8 这样的工具 - 它也带有自己的配置文件,即 .flake8

好的,现在我们有许多工具和许多配置文件,但这还不是全部。由于不是每个人都喜欢这么多的配置文件,所以有些工具支持与其他工具的配置文件一起配置。

例如您可以在setup.cfgtox.ini 中配置flake8,参见https://flake8.pycqa.org/en/latest/user/configuration.html

您也可以通过setup.cfgpyproject.toml配置tox,见https://tox.readthedocs.io/en/latest/config.html#configuration-discovery

还有一件重要的事情要知道:您只需要配置一次工具,而不是在所有这些文件中。

因此,从技术上讲,您不需要所有这些文件,您可以自行决定为您的项目设置哪些易于阅读且易于管理的设置。

在过去的 Python Ireland 聚会上,我进行了 5 分钟的闪电演讲,讲述了这一切是如何令人困惑的以及我想出了什么解决方案:

https://youtu.be/8iqhNbDHC-c

【讨论】:

  • 这是一个非常详细、很棒的答案!非常感谢,特别感谢视频。这将使我的预提交过程变得更加容易
  • 感谢您的反馈,很高兴能为您提供帮助!
猜你喜欢
  • 2017-01-21
  • 2020-05-15
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多