Tox: Conflicting basepython check fails for factor+testenv combination

Created on 7 Jan 2019  路  5Comments  路  Source: tox-dev/tox

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
minor wanted pr-rejected

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.

GitHub
Select 32 or 64-bit Python for Tox on Appveyor. Contribute to takluyver/tox_appveyor development by creating an account on GitHub.

All 5 comments

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

Was this page helpful?
0 / 5 - 0 ratings

Related issues

obestwalter picture obestwalter  路  5Comments

Borda picture Borda  路  4Comments

pytoxbot picture pytoxbot  路  4Comments

pytoxbot picture pytoxbot  路  5Comments

pytoxbot picture pytoxbot  路  5Comments