Здесь нужно понять две основные вещи:
envlist
- это глобальная настройка в разделе [tox]
. Определение его в [testenv:hello]
не имеет никакого эффекта
envlist
определяет или генерирует список env
имен. Это можно сделать либо статически, предоставив простой список, разделенный запятыми, либо - как вы это сделали - сгенерировать список комбинаторно из факторов, предоставленных с помощью специального синтаксиса {...}
. Результатом в обоих случаях является список имен сред, которые затем будут выполняться в отдельном virtualenvs
/ venvs
.
Итак, чтобы было совершенно ясно: в конце envlist
- это простой список env
имен - больше ничего. То, что делается с этими именами (или их частями (a.k.a. factor )), происходит во время выполнения в envs
.
Все эти среды выполняются, если вы вызываете tox без -e
. В вашем примере вы генерируете список envlist с синтаксисом {<factorX>,<factorY>}
, который основан на том же принципе, который предоставляется оболочками командной строки. Если вы запросите сгенерированные среды в вашей конфигурации tox, результат будет:
$ tox -a
py27-hello
py37-hello
hello
Это уже может показывать, что в вашей конфигурации что-то не так, потому что я не думаю, что вам нужен неквалифицированный hello
env.
То, что вы делаете, генерируя envlist и статически предоставляя hello
testenv с использованием синтаксиса [testenv:hello]
, смешивает их таким образом, что затем не дает желаемого результата.
Итак, давайте адаптируем ваш tox.ini
, чтобы избавиться от ненужного статически определенного testenv:hello
. Мы также избавились от локального ключа envlist
, так как он все равно не работал. Он не выдал ошибку, потому что произвольно названные ключи в envs
явно разрешены и иногда полезны.
[tox]
skipsdist = True
envlist = py{27,37}-hello
[testenv]
deps =
pytest
!py27: mock
# do not warn that echo is a command not in the venv
whitelist_externals = echo
commands =
{envpython} --version
hello: echo hello
Чтобы убедиться, что команда hello выполняется только, когда env имеет коэффициент hello
, вы можете использовать <factor>[,<factor>]: <some command>
, чтобы указать, что следует запускать, если имя env содержит определенный фактор ( которые являются именными частями, разделенными -
)
генерирует список имен сред, которые затем служат информацией для конкретных выполняемых сред.
Если я позвоню tox -a
снова на измененном ini, я получу:
py27-hello
py37-hello
Теперь я могу запросить полный набор или только факторы, позвонив, например, tox -e py27-hello
или даже tox -e hello
, которые затем будут использовать базовый Python и делать все, что соответствует коэффициенту.
Чтобы получить более полное представление о происходящем, вы можете отобразить полностью разрешенную конфигурацию для всех сред, которая выглядит примерно так:
$ tox --showconfig
[testenv:py27-hello]
envdir = /home/ob/do/play/.tox/py27-hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py27-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py27-hello'}
basepython = python2.7
description =
envtmpdir = /home/ob/do/play/.tox/py27-hello/tmp
envlogdir = /home/ob/do/play/.tox/py27-hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest]
commands = [['/home/ob/do/play/.tox/py27-hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False
[testenv:py37-hello]
envdir = /home/ob/do/play/.tox/py37-hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py37-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py37-hello'}
basepython = python3.7
description =
envtmpdir = /home/ob/do/play/.tox/py37-hello/tmp
envlogdir = /home/ob/do/play/.tox/py37-hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest, mock]
commands = [['/home/ob/do/play/.tox/py37-hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False
[testenv:hello]
envdir = /home/ob/do/play/.tox/hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/hello'}
basepython = /usr/bin/python
description =
envtmpdir = /home/ob/do/play/.tox/hello/tmp
envlogdir = /home/ob/do/play/.tox/hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest, mock]
commands = [['/home/ob/do/play/.tox/hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False