python tox:如何在环境中使用不同的python envlist

时间:2017-09-13 15:19:15

标签: python tox

这是我的tox.ini:

[tox]
envlist = py27,py35

[testenv]
deps =
    Flask
    connexion
    pytest
    coverage
    pytest-cov
    requests
    six
commands=pytest --junitxml xunit-reports/xunit-result-XXX.xml --cov {envsitepackagesdir} --cov-report=xml

[testenv:local]
#HOW DO I SPECIFY A NEW LIST OF PYENV LIKE 31,36 IN HERE????
commands=
    pytest --cov {envsitepackagesdir}/XXX  --cov-report html

当我运行tox时,它会在py27py35中运行。我希望tox -e local在不同的多个python环境中运行。我无法弄清楚如何做到这一点。我该怎么做呢?现在它甚至不尊重初始envlist,只能在Python 2.7上运行。

5 个答案:

答案 0 :(得分:4)

[tox]envlist只是一个默认值 - 在没有选项tox且没有-e环境变量的情况下调用TOXENV时要运行的环境列表。使用tox -e [tox]envlist后会被忽略。

您可以使用不同的python版本运行local环境,但我不知道如何多次运行它。您必须明确列出所有环境:

tox -e py33-local,py34-local

您可以使用tox'约定来缩短命令行:

tox -e 'py3{3,4}'-local

答案 1 :(得分:1)

所以你想要的是拥有两套不同的环境并独立运行它们。

首先要了解的是envlist是在没有-e选项的情况下调用tox时将运行的所有环境的列表。

接下来您需要了解的是,每个tox.ini只有一个列表,而且其中一个列在全局[tox]部分。

您必须了解的另一件事是pyXX因子(因子是由-符号分隔的环境名称的部分)对tox具有特殊含义,因为它们指示它构建环境有一个特定的口译员。它们也被称为“默认环境”(参见basic usage)。如果你在调用tox时没有要求这个因素,那么basepython解释器将用于构建virtualenv(你从中调用tox的解释器)。

所以如果你像你这样的tox.ini调用tox -e local,它将使用basepython执行[tox:local]中定义的内容,因为你没有定义应该使用哪个python来创建virtualenv ,所以它使用你用tox调用tox的相同解释器。

如果您希望能够与其他解释器一起调用您的本地因子,独立于其他环境,则可以启动以下内容(在v2 config docs中描述):

[tox]
envlist = {py27,py35}-remote,{py31,py36}-local

[testenv]
deps =
    Flask
    connexion
    pytest
    coverage
    pytest-cov
    requests
    six

[testenv:remote]
commands=pytest --junitxml xunit-reports/xunit-result-XXX.xml --cov {envsitepackagesdir} --cov-report=xml

[testenv:local]
commands= pytest --cov {envsitepackagesdir}/XXX --cov-report html

检查以下创建的env:

$ tox -a

py27-remote
py35-remote
py31-local
py36-local

使用花括号表示法的envlist是通过将所有因子与其排列组合来创建环境名称(这也可以包含更多维度)。

如果你说没有-e的tox,它们都将运行并且都使用正确的解释器。

如果您只想运行本地环境,则必须使用以下命令调用:

$ tox -e py31-local,py36

然后只有那两个会运行。要带走的是,如果你想运行所有环境的子集,你必须用它们的全名来询问它们。没有“子代”或额外的envlist魔法。只需在逗号分隔列表中列出envorenments的全名,您就是金色。

<强>更新

TIL了解到您实际上可以从命令行使用生成语法,因此您可以键入:

$ tox -e 'py{31,36}'-local

感谢@phd指出它。

答案 2 :(得分:0)

好的,我非常感谢和赞成其他两个答案,但我最终做的不同。实现一个单独的目标似乎很麻烦  python版本和命令。 我最终做的只是制作一个单独的tox.ini并将其称为tox -c tox-local.ini

答案 3 :(得分:0)

您尝试执行的操作的可能解决方案是使用tox -l列出所有环境,过滤所需的环境,然后将其反馈到tox -e

例如,要运行名称中具有“ local”(使用bash)的所有环境:

tox -e $(tox -l | grep local | paste -sd "," -)

分步说明:

  • tox -l列出所有环境,每行列出一个
  • grep local仅过滤输入中包含单词“ local”的行
  • paste -sd "," -将输入行与逗号连接起来

答案 4 :(得分:0)

使用generative envlist and factor-conditional settings

[tox]
envlist = {py27,py31,py35,py36}-{default,local}

[testenv]
deps =
    Flask
    connexion
    pytest
    coverage
    pytest-cov
    requests
    six

commands =
    {default,local}: python --version
    default: pytest --junitxml xunit-reports/xunit-result-XXX.xml --cov {envsitepackagesdir} --cov-report=xml
    local: pytest --cov {envsitepackagesdir}/XXX  --cov-report html

使用tox -l

列出python版本和因素的所有可能组合

对于“本地”情况,您可以通过以下方式之一调用tox:

  • tox -e py31-local
  • tox -e py36-local
  • tox -e 'py3{1,6}'-local

@oliver-bestwalter的回答影响很大,但由于某种原因我无法使其正常工作。