pip从setup.py安装tox的tox依赖项

时间:2015-04-25 20:56:20

标签: python pip setuptools easy-install tox

我使用upper left制作了我的项目,我想用setuptools进行测试。我在变量中列出了依赖项,并添加到tox参数(setup()tests_require)。我的项目需要安装extras_require中列出的所有依赖项进行测试,但tests_require未安装它们。

我尝试了这个,但它不起作用:

pip install

如何在不必管理多个依赖项列表的情况下安装测试依赖项(即install_command = pip install {opts} {packages}[tests] test_requirements.txt变量中都列出了所有依赖项?)

4 个答案:

答案 0 :(得分:28)

我通过轻微滥用extra requirements来实现这一目标。你几乎在那里尝试额外的语法,只是tests_require deps不能自动提供。

这样setup.py

from setuptools import setup

test_deps = [
    'coverage',
    'pytest',
]
extras = {
    'test': test_deps,
}

setup(
    # Other metadata...
    tests_require=test_deps,
    extras_require=extras,
)

然后,您可以使用extras语法获取安装的测试依赖项,例如:从项目根目录:

$ pip install .[test]

tox.ini中为Tox提供相同的语法,无需调整默认install_command

[testenv]
commands = {posargs:pytest}
deps = .[test]

现在您不需要在两个位置维护依赖项列表,并且它们表示它们应该用于已发布包的位置:在打包元数据中而不是requirements.txt个文件中。

看来这个小小的额外内容是is not all that uncommon

答案 1 :(得分:3)

您可以做的是拥有一个文件(称为test_requirements.txt)并列出测试依赖项,如下所示:

dnspython==1.12.0
easydev==0.8.3
enum34==1.0.4
fabric==1.10.1
...

然后,在setup.py中,将文件内容解析并存储在列表中,并将该列表传递给setup

tests_require = [line.strip() for line in 
                 open('test_requirements.txt')
                 if line.strip() and not line.strip().startswith('--')]

setuptools.setup(
    ...
    tests_require=tests_require,
    ...
)

答案 2 :(得分:2)

如果使用以下命令,Tox将在运行测试之前安装test_requires

commands = {envpython} setup.py test

您还需要add to setup.py进行以下测试:

test_suite="tests_module"

最后,here是一个类似问题的答案,其中有一个很好的例子。

答案 3 :(得分:0)

Tox建议避免使用python setup.py test。因此,我们可以随意使用“ extras”而不是“ tests_require”。

调用deps =。[test]将从您当前的工作目录中安装整个软件包。有点浪费,因为在此操作之后,tox仍会安装sdist。另外,如果要从sdist安装主软件包,则可能还需要从其安装'extras'。

您对install_command的编辑将尝试从“ extras”而非“ tests_require”安装“ tests”。即使有效,也会影响部门列出的所有项目,不是一个好主意。

解决方案

Tox 2.6引入了extras选项。这将从sdist安装“ extras”,仅针对您的sdist并在其进行常规sdist安装时安装。