Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python tox: how to use a different python envlist in environment

Tags:

python

tox

Here is my 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

When I run tox it runs in py27 and py35. I want tox -e local to run in a different set of multiple python environments. I can't figure out how to do this. How do I do this? Right now it does not even respect the intial envlist and only runs on Python 2.7.

like image 295
Tommy Avatar asked Sep 13 '17 15:09

Tommy


2 Answers

So what you want is to have two different sets of environments and run them independently.

What you have to understand first is that envlist is a list of all environments that would be run if you invoke tox without the -e option.

The next thing you have to understand is that there is only one of these lists per tox.ini and that one is in the global [tox] section.

The other thing you have to understand is that the pyXX factors (factors are the parts of environment names that are separated by the - sign) have a special meaning for tox, because they instruct it to build an environment with a specific interpreter. They are also called "default environments" (see basic usage). If you don't ask for that factor when calling tox, then the basepython interpreter will be used to build the virtualenv (the interpreter you are invoking tox from).

so if you invoke tox -e local with a tox.ini like yours, it will execute what is defined in [tox:local] with the basepython, because you are not defining which python should be used to create the virtualenv, so it uses the same interpreter that you invoked tox with.

If you want to be able to invoke your local factor with other interpreters, independent from those other environments, the following could get you started (described in the 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

Check which envs this creates with:

$ tox -a

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

What envlist with the curly braces notation does, is create environment names by combining all factors with their permutations (this can have more dimensions also).

if you say tox without -e they will all run and all use the correct interpreter.

If you want to run the local envs only you will have to call it with:

$ tox -e py31-local,py36

Then only those two will run. The thing to take away here is that if you want to run a subset of all environments you have to ask for them with their full names. There is no "sub generation" or extra envlist magic. Just list the full names of the envorenments in a comma separated list and you are golden.

UPDATE

TIL learned that you can actually use the generation syntax from the command line, so you could type:

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

Thank you @phd for pointing it out.

like image 187
Oliver Bestwalter Avatar answered Oct 05 '22 12:10

Oliver Bestwalter


A possible solution to what you are attempting to do is to use tox -l to list all the environments, filter the ones you want, and then feed them back into tox -e.

For example, to run all environments that have "local" in the name (using bash):

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

Step-by-step explanation:

  • tox -l lists all the environments, one on each line
  • grep local filters only the lines of the input which contain the word "local"
  • paste -sd "," - joins the lines of the input with commas
like image 40
brianmaissy Avatar answered Oct 05 '22 10:10

brianmaissy