【问题标题】:Tox uses the wrong interptererTox 使用了错误的解释器
【发布时间】:2021-03-16 23:08:06
【问题描述】:

我发现了一些类似的问题/答案,但不是我所拥有的。感谢您的帮助!

系统:ubuntu 20.04 全新安装,python 3.8.5 系统安装,pyenv 运行良好。 不过,Tox 会创建 venv,但会继续运行系统解释器。

pyenv 运行良好:

aj@jaja:/tmp$ python --version
Python 3.8.5
aj@jaja:/tmp$ pyenv versions
* system (set by /home/aj/.pyenv/version)
  3.6.13
  pypy3.6-7.0.0
aj@jaja:/tmp$ pyenv local 3.6.13
aj@jaja:/tmp$ python --version
Python 3.6.13

我的 tox.ini :

[tox]
envlist = 3.6.13, 3.8.5
skipsdist = True

[testenv]
deps =
    pytest

commands =
    python --version
    python -c 'import sys; print(sys.executable)'
    pytest

tox 似乎可以很好地创建 venv:

aj@jaja:/tmp/foo$ tox -l
3.6.13
3.8.5

但它总是运行系统解释器而不是 venv 解释器:

3.6.13 installed: attrs==20.3.0,iniconfig==1.1.1,packaging==20.9,pluggy==0.13.1,py==1.10.0,pyparsing==2.4.7,pytest==6.2.2,toml==0.10.2
3.6.13 run-test-pre: PYTHONHASHSEED='3215808768'
3.6.13 run-test: commands[0] | python --version
**Python 3.8.5**
3.6.13 run-test: commands[1] | python -c 'import sys; print(sys.executable)'
**/tmp/foo/.tox/3.6.13/bin/python**
3.6.13 run-test: commands[2] | pytest
======================================================================= test session starts =======================================================================
platform linux -- Python 3.8.5, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
cachedir: .tox/3.6.13/.pytest_cache
rootdir: /tmp/foo
collected 1 item  

                                                                                                                                            

test_calc.py .

感兴趣的 pyenv 显示了这一点,但我不知道如何直接使用 tox 来纠正它:

aj@jaja:/tmp/foo$ cat .tox/3.6.13/pyvenv.cfg 
home = /usr
implementation = CPython
version_info = 3.8.5.final.0
virtualenv = 20.4.3
include-system-site-packages = false
base-prefix = /usr
base-exec-prefix = /usr
base-executable = /usr/bin/python3.8

【问题讨论】:

  • 更新:感谢你们两位的指示和信息 :) 我的错误是我认为 tox 会安装所需的环境,如果它之前下载过。就我而言,3.6 已下载但未激活。 => 我在顶部添加了一个图层以使两者都可用:aj@jaja:~/foo_env$ pyenv local 3.6.13 3.8.5 aj@jaja:~/foo_env$ cd foo/aj@jaja:~/foo_env$ rm -rf .tox aj@jaja:~/foo_env$ tox aj@jaja:~/foo_env/foo$ tox

标签: python pyenv tox


【解决方案1】:

您的环境未命名,tox 期望它们如何命名

约定是py##,其中##是不带点的版本(或者###,在3.10+的情况下)

所以在你的情况下你想要:

envlist = py36,py38

这将导致 tox 在您的 PATH 上自动查找和使用 python3.6python3.8 -- 如果您需要它来选择特定的解释器,您可以使用 envpython 个人 [testenv] 中的设置/p>


免责声明:我是 tox 核心维护者之一

【讨论】:

  • env 名称的完整规范实际上是 https://virtualenv.pypa.io/en/latest/user_guide.html#python-discovery ? 任何符合该规范的内容都会受到尊重。如果没有发生这种情况,请确保始终发布输出或 tox -vv 以便我们可以看到哪里以及哪里出了问题。同样正如@klausf 指出的那样,确保您使用 pyenv 启用所有 env ?所以它们可以像链接文档中描述的那样被发现。,?
  • 谢谢安东尼!
  • tox 很棒,使用 pyenv 和 pytest,这是朝着快乐编码前进的十年:)
【解决方案2】:

我从未遇到过与 tox 相关的 pyenv 问题: 只需确保启用 所有 版本,tox 将使用该版本。

例如

pyenv shell system 3.6.13
tox

我也认为,tox 只处理两个版本号,所以尝试在你的 tox.ini 文件中更改为 3.63.8

编辑: 事实上,正如@Anthony Sottile 的回答中所指出的那样:(阅读你的问题时我什至没有注意到。 你必须使用py36py38 而不是3.63.8,正如我在最初的回答中所建议的那样

您可以使用 pyenv 强制使用 3.6 或 3.8 的确切版本

一般来说,测试 3.6.a 和 3.6.b 并没有多大意义 通常较新的子版本应该与以前的完全兼容,当然错误行为除外,已修复

仅供参考:(我知道你不会尝试这样做)

请注意,您不能以有意义的方式在一个 pyenv“会话”(shell)中激活例如 3.6.1 和 3.6.2。

键入以下命令以了解我的意思:

pyenv which python
pyenv which python3
pyenv which python3.6
pyenv which python3.6.13  # this one will not be found

【讨论】:

  • 谢谢克劳斯!
猜你喜欢
  • 2020-07-05
  • 2014-05-05
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
相关资源
最近更新 更多