这是我的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环境中运行。我无法弄清楚如何做到这一点。我该怎么做呢?现在它甚至不尊重初始envlist,只能在Python 2.7上运行。
答案 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
对于“本地”情况,您可以通过以下方式之一调用tox:
tox -e py31-local
tox -e py36-local
tox -e 'py3{1,6}'-local
受@oliver-bestwalter的回答影响很大,但由于某种原因我无法使其正常工作。