Python tox: cómo usar un envlist de Python diferente en el entorno

13

Aquí está mi 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

Cuando lo ejecuto, toxse ejecuta py27y py35. Quiero tox -e localejecutar en un conjunto diferente de múltiples entornos de Python. No sé cómo hacer esto. ¿Cómo hago esto? En este momento, ni siquiera respeta la lista de entornos inicial y solo se ejecuta en Python 2.7.

10

Entonces, lo que desea es tener dos conjuntos de entornos diferentes y ejecutarlos de forma independiente.

Lo que debe comprender primero es que envlistes una lista de todos los entornos que se ejecutarían si invoca a tox sin la -eopción.

Lo siguiente que debe comprender es que solo hay una de estas listas por tox.iniy esa está en la [tox]sección global .

La otra cosa que debe comprender es que los factores pyXX (los factores son las partes de los nombres de los entornos que están separados por el -signo) tienen un significado especial para tox, porque le indican que cree un entorno con un intérprete específico. También se denominan "entornos predeterminados" (consulte el uso básico ). Si no solicita ese factor al llamar a tox, el basepythonintérprete se utilizará para construir el virtualenv (el intérprete desde el que está invocando a tox).

por lo tanto, si invoca tox -e localcon un tox.ini como el suyo, ejecutará lo que está definido [tox:local]con basepython, porque no está definiendo qué python debe usarse para crear el virtualenv, por lo que usa el mismo intérprete con el que invocó a tox.

Si desea poder invocar su factor local con otros intérpretes, independientemente de esos otros entornos, lo siguiente podría ayudarlo a comenzar (descrito en los documentos de configuración 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

Compruebe qué envs crea esto con:

$ tox -a

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

Lo que hace envlist con la notación de llaves es crear nombres de entorno combinando todos los factores con sus permutaciones (esto también puede tener más dimensiones).

si dice tox sin -e, todos se ejecutarán y utilizarán el intérprete correcto.

Si desea ejecutar los envs locales solo tendrá que llamarlo con:

$ tox -e py31-local,py36

Entonces solo esos dos correrán. Lo que debe llevarse a cabo aquí es que si desea ejecutar un subconjunto de todos los entornos, debe solicitarlos con sus nombres completos. No hay "subgeneración" ni magia envlist adicional. Simplemente enumere los nombres completos de los entornos en una lista separada por comas y estará dorado.

ACTUALIZAR

TIL aprendió que en realidad puede usar la sintaxis de generación desde la línea de comando, por lo que puede escribir:

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

Gracias @phd por señalarlo.

5

Una posible solución a lo que está intentando hacer es usar tox -lpara enumerar todos los entornos, filtrar los que desea y luego retroalimentarlos tox -e.

Por ejemplo, para ejecutar todos los entornos que tienen "local" en el nombre (usando bash):

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

Explicación paso a paso:

  • tox -l enumera todos los entornos, uno en cada línea
  • grep local filtra solo las líneas de la entrada que contienen la palabra "local"
  • paste -sd "," - une las líneas de la entrada con comas
1
3

[tox]envlistes solo un valor predeterminado: una lista de entornos para ejecutar cuando toxse invoca sin opción -ey sin TOXENVvariable de entorno. Una vez que lo usa, tox -e [tox]envlistse ignora.

Puede ejecutar el localentorno con diferentes versiones de Python, pero no conozco ninguna forma de ejecutarlo varias veces. Tienes que enumerar todos los entornos explícitamente:

tox -e py33-local,py34-local

Puede acortar la línea de comando usando las convenciones de tox ':

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

Utilice entornos generativos de lista de entornos y condicionales de factores .

[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

Enumere todas las combinaciones posibles de versión y factores de Python usando: tox -l

Para su caso "local", invocaría tox de una de las siguientes formas:

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

Respuesta muy influenciada por la respuesta de @ oliver-bestwalter , pero no pude hacer que eso funcione correctamente por alguna razón.

0

De acuerdo, aprecio mucho y voté a favor de las otras dos respuestas aquí, pero lo que terminé haciendo fue diferente. Parecía oneroso solo lograr una versión y un comando de Python separados. Lo que terminé haciendo fue hacer un tox.ini separado y llamarlo comotox -c tox-local.ini