Ubuntu20.04搭配pyenv使用Tox时错误调用系统Python解释器的问题
问题核心原因
- Tox 不会自动感知 pyenv 的本地版本切换,默认靠系统 PATH 检索可匹配的解释器,当检索不到和环境对应的解释器时,会直接 fallback 到当前能找到的任意可用 Python 版本创建虚拟环境
- 你遇到的 pyvenv.cfg 绑定
/usr/bin/python3.8的现象,本质是 tox 创建名为3.6.13的环境时,根本没匹配到 pyenv 安装的 Python 3.6.13 解释器:tox 默认只识别pythonX.Y格式的解释器名称,直接把带 patch 版本号的环境名(如3.6.13)当成普通测试环境命名,没有对应配置时就用系统 Python 3.8 直接建了虚拟环境,哪怕虚拟环境目录路径是对的,里面的解释器实际是 3.8 的副本。
可直接落地的修正步骤
1. 调整 tox.ini 配置
不要依赖 tox 自动猜测解释器路径,通过 basepython 参数显式指定 pyenv 安装的对应解释器绝对路径。如果需要保留原有的自定义环境名(如3.6.13、3.8.5),只需要为每个环境单独配置即可,不需要修改环境名称,参考配置:
[tox] envlist = 3.6.13, 3.8.5 skipsdist = True [testenv:3.6.13] # 指向 pyenv 安装的 3.6.13 解释器实际路径 basepython = ~/.pyenv/versions/3.6.13/bin/python3.6 deps = pytest commands = python --version python -c 'import sys; print(sys.executable)' pytest [testenv:3.8.5] basepython = ~/.pyenv/versions/3.8.5/bin/python3.8 deps = pytest commands = python --version python -c 'import sys; print(sys.executable)' pytest
2. 清理旧的错误虚拟环境
之前tox已经用系统Python 3.8建错了3.6.13的虚拟环境缓存,直接运行tox会复用旧环境,必须加参数强制重建:
tox -e 3.6.13 --recreate
3. 验证修复效果
- 运行后查看输出的
python --version结果,确认是Python 3.6.13 - 检查虚拟环境目录下的
pyvenv.cfg文件,看home字段是否指向pyenv对应版本的bin目录,而不是系统的/usr/bin路径
可选优化方式
如果不想每次在配置里写死解释器绝对路径,可以在执行tox前确认pyenv的shim目录在PATH的最前端,保证shell执行which python3.6能正确返回pyenv对应版本的路径,这种情况下tox可以自动检索到对应解释器,不需要硬编码路径。
内容的提问来源于stack exchange,提问作者jefsomething
相关产品推荐
相关产品推荐

