繁体   English   中英

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

[英]python tox: how to use a different python envlist in environment

这是我的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上运行。

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

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

tox -e py33-local,py34-local

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

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

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

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

接下来你需要了解的是,每个tox.ini只有一个列表,而且这个列表位于全局[tox]部分。

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

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

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

[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

检查这创建的envs:

$ tox -a

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

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

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

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

$ tox -e py31-local,py36

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

UPDATE

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

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

谢谢@phd指出来。

使用生成envlist和因子条件设置

[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的回答影响很大,但由于某些原因我无法正常工作。

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

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

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

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

分步说明:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM