PythonTox:如何在环境中使用不同的PythonEnvList

PythonTox:如何在环境中使用不同的PythonEnvList,python,tox,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 [t

这是我的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
时,它在
py27
py35
中运行。我想要
tox-e local
在不同的多个python环境中运行。我不知道该怎么做。我该怎么做?现在,它甚至不尊重初始环境列表,只在Python 2.7上运行。

[tox]envlist
只是一个默认值-当调用
tox
时,在没有选项
-e
TOXENV
环境变量的情况下运行的环境列表。一旦您使用了
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使用特定的解释器构建环境。它们也称为“默认环境”(请参阅)。如果您在调用tox时没有询问该因素,那么将使用
basepython
解释器来构建virtualenv(从中调用tox的解释器)

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

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

检查创建的环境:

$ tox -a

py27-remote
py35-remote
py31-local
py36-local
带花括号符号的envlist所做的是通过组合所有因子及其排列来创建环境名称(这也可以有更多维度)

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

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

$ tox -e py31-local,py36
那么只有这两个人会参加竞选。这里需要注意的是,如果您想要运行所有环境的子集,您必须要求使用它们的全名。没有“子代”或额外的环境列表魔法。只要在一个逗号分隔的列表中列出环境的全名,你就是金色的

更新

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

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

谢谢你指出这一点。

好的,我非常感谢并支持这里的其他两个答案,但我最终做的是不同的。仅仅实现一个单独的目标似乎很繁重 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“,”-
    将输入行与逗号连接起来
    • 使用

      使用:
      tox-l

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

      • tox-e py31本地版
      • tox-e py36本地版
      • tox-e'py3{1,6}'-本地

      答案受的答案影响很大,但由于某种原因,我无法让它正常工作。

      最不疯狂的答案。其他一切都需要人工干预,因此违反了DRY(例如,通过或),这是疯狂的。相反,只需在
      ~/.zshrc
      中将上述一行代码填充到shell脚本或shell别名中(例如,
      别名toxit='tox-e$(tox-l | grep local | paste-sd,“-)'
      )。感受为您完成所有繁重工作的令人振奋的自动化自由。
      $ tox -e 'py{31,36}'-local
      
      [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