tox无法识别pyenv安装的Python版本,如何解决?
问题描述
我正在学习使用tox进行多版本Python单元测试,已通过pyenv在/home/username/.pyenv/versions/version_number/bin/python路径下安装了3.9.16、3.10.9等多个Python版本,项目用poetry创建了本地.venv文件夹,并在pyproject.toml中配置了对应的tox环境。
项目目录结构:
hello |_ pyproject.toml |_ hello | |_ __init__.py | |_ main.py |_tests | |_ __init__.py |_ test_main.py
pyproject.toml中的tox配置:
[tool.pytest.ini_options] testpaths = ["tests"] console_output_style = "progress" [tool.tox] legacy_tox_ini = """ [tox] env_list = py39, py310, mypy [testenv] deps = pytest [testenv:py39] basepython = /home/jonwebb/.pyenv/versions/3.9.16/bin/python [testenv:py310] basepython = /home/jonwebb/.pyenv/versions/3.10.9/bin/python [testenv:mypy] deps = mypy commands = mypy hello """
在顶层hello目录运行tox时出现报错:
py39: failed with env name py39 conflicting with base python /home/username/.pyenv/version/3.9.16/bin/python py310: failed with env name py310 conflicting with base python /home/username/.pyenv/versions/3.10.9/bin/python
修复方案
报错原因是tox默认会识别py39、py310这类环境名,并自动匹配系统中的对应Python版本,手动指定basepython路径后触发了命名冲突。可通过以下两种方式修复:
方法1:重命名自定义环境
修改环境名称,避开tox默认的pyXX命名格式,直接消除冲突:
[tool.tox] legacy_tox_ini = """ [tox] env_list = py39-pyenv, py310-pyenv, mypy [testenv] deps = pytest [testenv:py39-pyenv] basepython = /home/jonwebb/.pyenv/versions/3.9.16/bin/python [testenv:py310-pyenv] basepython = /home/jonwebb/.pyenv/versions/3.10.9/bin/python [testenv:mypy] deps = mypy commands = mypy hello """
修改后重新运行tox即可正常识别pyenv安装的Python版本。
方法2:利用tox自动匹配pyenv版本
确保pyenv的shims目录在系统PATH中(pyenv安装后通常会自动配置),然后简化配置,让tox自动通过pyenv找到对应版本:
[tool.tox] legacy_tox_ini = """ [tox] env_list = py39, py310, mypy [testenv] deps = pytest [testenv:mypy] deps = mypy commands = mypy hello """
tox会自动识别pyenv管理的python3.9和python3.10,无需手动指定路径。
如果需要结合poetry的依赖环境,可在testenv中补充命令:
[testenv] deps = pytest commands = poetry run pytest
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

