For this given tox.ini:
[tox]
envlist =
{py27,py34,py35,py36,py37}-{cover,nocov}
[testenv]
basepython =
py27: {env:TOXPYTHON:python2.7}
py34: {env:TOXPYTHON:python3.4}
py35: {env:TOXPYTHON:python3.5}
py36: {env:TOXPYTHON:python3.6}
py37: {env:TOXPYTHON:python3.7}
commands =
python -c 'import sys; print(sys.version_info)'
[testenv:py27-cover]
usedevelop = true
[testenv:py34-cover]
usedevelop = true
[testenv:py35-cover]
usedevelop = true
[testenv:py36-cover]
usedevelop = true
[testenv:py37-cover]
usedevelop = true
I get this sort of output:
> tox --version 3.6.1 imported from /usr/local/lib/python3.6/dist-packages/tox/__init__.py
> TOXPYTHON=$(which python3.7) tox -e py37-cover /usr/local/lib/python3.6/dist-packages/tox/config.py:569: UserWarning: conflicting basepython version (set 37, should be 27) for env 'py27-cover';resolve conflict or set ignore_basepython_conflict
proposed_version, implied_version, testenv_config.envname
/usr/local/lib/python3.6/dist-packages/tox/config.py:569: UserWarning: conflicting basepython version (set 37, should be 34) for env 'py34-cover';resolve conflict or set ignore_basepython_conflict
proposed_version, implied_version, testenv_config.envname
/usr/local/lib/python3.6/dist-packages/tox/config.py:569: UserWarning: conflicting basepython version (set 37, should be 35) for env 'py35-cover';resolve conflict or set ignore_basepython_conflict
proposed_version, implied_version, testenv_config.envname
/usr/local/lib/python3.6/dist-packages/tox/config.py:569: UserWarning: conflicting basepython version (set 37, should be 36) for env 'py36-cover';resolve conflict or set ignore_basepython_conflict
proposed_version, implied_version, testenv_config.envname
py37-cover create: /home/ionel/.tox/py37-cover
py37-cover develop-inst: /home/ionel
....
This only happens if I have those [testenv:pyXX-cover] sections.
Now why do I do it like that you might ask? Well ... on Windows I can specialize on different builds for the same python versions, eg, I want to test both 32bit and 64bit pythons, thus I run with both TOXPYTHON=C:\Python37-x64\python.exe and TOXPYTHON=C:\Python37\python.exe (32bit).
So after writing all that bugreport I realized I can just use factors for usedevelop but I'm submitting anyway, maybe someone has the same problem or you want to fix the check 馃槄 . Eg:
usedevelop =
cover: true
nocov: false
Thanks for reporting @ionelmc. If I plug this in tox --showconfig everthing looks correct, so the warning is a false alarm, so this is definitely a display bug:
tool-versions: tox-3.6.1 virtualenv-16.0.0
config-file:
toxinipath: /home/ob/do/play/tox.ini
toxinidir: /home/ob/do/play
toxworkdir: /home/ob/do/play/.tox
setupdir: /home/ob/do/play
distshare: /home/ob/.tox/distshare
skipsdist:
[testenv:py27-cover]
envdir = /home/ob/do/play/.tox/py27-cover
setenv = SetenvDict: {'PYTHONHASHSEED': '862043223', 'TOX_ENV_NAME': 'py27-cover', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py27-cover'}
basepython = python2.7
description =
envtmpdir = /home/ob/do/play/.tox/py27-cover/tmp
envlogdir = /home/ob/do/play/.tox/py27-cover/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'LD_LIBRARY_PATH', 'LANG', 'PIP_INDEX_URL', 'TMPDIR', 'LANGUAGE', 'TOX_WORK_DIR', 'PATH'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = True
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = []
commands = [['python', '-c', 'import sys; print(sys.version_info)']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
[testenv:py27-nocov]
envdir = /home/ob/do/play/.tox/py27-nocov
setenv = SetenvDict: {'PYTHONHASHSEED': '862043223', 'TOX_ENV_NAME': 'py27-nocov', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py27-nocov'}
basepython = python2.7
description =
envtmpdir = /home/ob/do/play/.tox/py27-nocov/tmp
envlogdir = /home/ob/do/play/.tox/py27-nocov/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'LD_LIBRARY_PATH', 'LANG', 'PIP_INDEX_URL', 'TMPDIR', 'LANGUAGE', 'TOX_WORK_DIR', 'PATH'}
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 = []
commands = [['python', '-c', 'import sys; print(sys.version_info)']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
[testenv:py34-cover]
envdir = /home/ob/do/play/.tox/py34-cover
setenv = SetenvDict: {'PYTHONHASHSEED': '862043223', 'TOX_ENV_NAME': 'py34-cover', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py34-cover'}
basepython = python3.4
description =
envtmpdir = /home/ob/do/play/.tox/py34-cover/tmp
envlogdir = /home/ob/do/play/.tox/py34-cover/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'LD_LIBRARY_PATH', 'LANG', 'PIP_INDEX_URL', 'TMPDIR', 'LANGUAGE', 'TOX_WORK_DIR', 'PATH'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = True
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = []
commands = [['python', '-c', 'import sys; print(sys.version_info)']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
[testenv:py34-nocov]
envdir = /home/ob/do/play/.tox/py34-nocov
setenv = SetenvDict: {'PYTHONHASHSEED': '862043223', 'TOX_ENV_NAME': 'py34-nocov', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py34-nocov'}
basepython = python3.4
description =
envtmpdir = /home/ob/do/play/.tox/py34-nocov/tmp
envlogdir = /home/ob/do/play/.tox/py34-nocov/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'LD_LIBRARY_PATH', 'LANG', 'PIP_INDEX_URL', 'TMPDIR', 'LANGUAGE', 'TOX_WORK_DIR', 'PATH'}
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 = []
commands = [['python', '-c', 'import sys; print(sys.version_info)']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
[testenv:py35-cover]
envdir = /home/ob/do/play/.tox/py35-cover
setenv = SetenvDict: {'PYTHONHASHSEED': '862043223', 'TOX_ENV_NAME': 'py35-cover', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py35-cover'}
basepython = python3.5
description =
envtmpdir = /home/ob/do/play/.tox/py35-cover/tmp
envlogdir = /home/ob/do/play/.tox/py35-cover/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'LD_LIBRARY_PATH', 'LANG', 'PIP_INDEX_URL', 'TMPDIR', 'LANGUAGE', 'TOX_WORK_DIR', 'PATH'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = True
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = []
commands = [['python', '-c', 'import sys; print(sys.version_info)']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
[testenv:py35-nocov]
envdir = /home/ob/do/play/.tox/py35-nocov
setenv = SetenvDict: {'PYTHONHASHSEED': '862043223', 'TOX_ENV_NAME': 'py35-nocov', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py35-nocov'}
basepython = python3.5
description =
envtmpdir = /home/ob/do/play/.tox/py35-nocov/tmp
envlogdir = /home/ob/do/play/.tox/py35-nocov/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'LD_LIBRARY_PATH', 'LANG', 'PIP_INDEX_URL', 'TMPDIR', 'LANGUAGE', 'TOX_WORK_DIR', 'PATH'}
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 = []
commands = [['python', '-c', 'import sys; print(sys.version_info)']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
[testenv:py36-cover]
envdir = /home/ob/do/play/.tox/py36-cover
setenv = SetenvDict: {'PYTHONHASHSEED': '862043223', 'TOX_ENV_NAME': 'py36-cover', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py36-cover'}
basepython = python3.6
description =
envtmpdir = /home/ob/do/play/.tox/py36-cover/tmp
envlogdir = /home/ob/do/play/.tox/py36-cover/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'LD_LIBRARY_PATH', 'LANG', 'PIP_INDEX_URL', 'TMPDIR', 'LANGUAGE', 'TOX_WORK_DIR', 'PATH'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = True
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = []
commands = [['python', '-c', 'import sys; print(sys.version_info)']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
[testenv:py36-nocov]
envdir = /home/ob/do/play/.tox/py36-nocov
setenv = SetenvDict: {'PYTHONHASHSEED': '862043223', 'TOX_ENV_NAME': 'py36-nocov', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py36-nocov'}
basepython = python3.6
description =
envtmpdir = /home/ob/do/play/.tox/py36-nocov/tmp
envlogdir = /home/ob/do/play/.tox/py36-nocov/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'LD_LIBRARY_PATH', 'LANG', 'PIP_INDEX_URL', 'TMPDIR', 'LANGUAGE', 'TOX_WORK_DIR', 'PATH'}
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 = []
commands = [['python', '-c', 'import sys; print(sys.version_info)']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
[testenv:py37-cover]
envdir = /home/ob/do/play/.tox/py37-cover
setenv = SetenvDict: {'PYTHONHASHSEED': '862043223', 'TOX_ENV_NAME': 'py37-cover', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py37-cover'}
basepython = python3.7
description =
envtmpdir = /home/ob/do/play/.tox/py37-cover/tmp
envlogdir = /home/ob/do/play/.tox/py37-cover/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'LD_LIBRARY_PATH', 'LANG', 'PIP_INDEX_URL', 'TMPDIR', 'LANGUAGE', 'TOX_WORK_DIR', 'PATH'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = True
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = []
commands = [['python', '-c', 'import sys; print(sys.version_info)']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
[testenv:py37-nocov]
envdir = /home/ob/do/play/.tox/py37-nocov
setenv = SetenvDict: {'PYTHONHASHSEED': '862043223', 'TOX_ENV_NAME': 'py37-nocov', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py37-nocov'}
basepython = python3.7
description =
envtmpdir = /home/ob/do/play/.tox/py37-nocov/tmp
envlogdir = /home/ob/do/play/.tox/py37-nocov/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'LD_LIBRARY_PATH', 'LANG', 'PIP_INDEX_URL', 'TMPDIR', 'LANGUAGE', 'TOX_WORK_DIR', 'PATH'}
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 = []
commands = [['python', '-c', 'import sys; print(sys.version_info)']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
@obestwalter Run TOXPYTHON=python3.5 tox --showconfig to see the problem.
We have a similar issue on h5py, where we're also trying to test with 32-bit and 64-bit Python. To avoid telling tox that every Python is now the one we want to test on, I've had a go at writing a tiny plugin that uses an environment variable to control which one you use:
https://github.com/takluyver/tox_appveyor
https://github.com/h5py/h5py/pull/1196
This may change completely or be abandoned if we don't take this approach for h5py.
GitHub
Select 32 or 64-bit Python for Tox on Appveyor. Contribute to takluyver/tox_appveyor development by creating an account on GitHub.
Feel free to open a PR against master and fix it. My available efforts at the moment are aimed at fixing this as part of https://github.com/tox-dev/tox/issues/1394, but that probably will take a while (ETA September).
@takluyver Your feature request is already discussed at #1149
Most helpful comment
We have a similar issue on h5py, where we're also trying to test with 32-bit and 64-bit Python. To avoid telling tox that every Python is now the one we want to test on, I've had a go at writing a tiny plugin that uses an environment variable to control which one you use:
https://github.com/takluyver/tox_appveyor
https://github.com/h5py/h5py/pull/1196
This may change completely or be abandoned if we don't take this approach for h5py.