setuptools 如何在 python setup.py 测试命令上安装测试依赖项

How does setuptools installs test dependencies on python setup.py test command

当我使用命令 python setup.py test 时,我看到的所有 documentation 都表示 setuptools 将处理安装测试依赖项。它在哪里安装它们?在测试套件运行后它们是否从机器上删除?我注意到此命令完成后 none 个测试模块实际上已安装到我的虚拟环境中。

我知道它需要 tests_require 列表中的所有模块并将它们安装在某个地方,但我不确定在哪里,之后它对它们做了什么以及为什么这样做。另外,有没有什么方法可以在不使用标志的情况下将参数传递给命令,比如使用配置文件或其他东西?

避免 python setup.py testtests_require,它很笨拙,现在是 deprecated.

那个旧功能只是将测试 deps 下载到项目的安装目录,这很少是开发人员想要或期望发生的事情!这在具有虚拟环境的现代 CI 工作流中效果不佳,您可能希望将依赖项安装到站点包中。

The recommended way to do it using setuptools these days is with an extras_require tag.. See 举个例子。

它将它们作为 .eggs 安装到代码库 named .eggs 的自动创建的子目录中。那是因为 .egg 设计为可从任何位置导入。

因此这很可能无法在现代环境中工作,因为包不是作为 .eggs 分发的(它失去了对 .whls 的竞争)所以 setuptools 将不得不构建他们来自源代码(bdist_egg)。对于许多具有非平凡构建要求的广泛使用的二进制包来说,这可能会失败(更不用说所需的时间以及包未作为 .eggs 进行测试的事实,并且在像这样打包时可能会失败)。


相反,在 requirements.txt 中列出构建要求并在构建之前调用 pip install -r requirements.txt 似乎已成为普遍做法。不过,这不会使 setup.py 可由 pip 从源代码自动构建。

我尝试自己从 setup.py 安装它们,但这被证明是脆弱的(例如,如果用户没有对 site-packages 的写入权限)。

至少有一些知名项目采用的最佳解决方案似乎是让 setup.py 在不存在的情况下失败。如果要求不是 Python 但 C 库是特别有用的,因为 setup.py 不知道如何在特定环境中安装它们。如您所见,这自然地补充了 requirements.txt