如何管理 Windows 10 中的多个 Python 版本以与 Python tox 一起使用?

How to manage multiple Python versions in Windows 10 to use with Python tox?

我正在尝试使用 tox 在 Python 3.7 和 3.8 上自动对我的项目进行 pytest 测试,但我正在为如何最好地设置它而苦苦挣扎。在我的 Windows 10 机器上安装多个 Python 版本以便将它们与 tox 一起使用的最简单方法是什么?

如果我只是使用官方安装程序手动安装它们,我该如何设置我的环境变量?因为每个安装都包含 python.exe,所以如果我安装两个版本并将它们的路径 C:\Program Files\Python37\C:\Program Files\Python38\ 添加到我的 Path 环境变量中,这将无法区分它们... python 将只引用列出的第一个。那么我是否需要手动将 python.exe 文件重命名为 python37.exepython38.exe 之类的名称?这一切看起来非常手动和笨拙,但我找不到关于此步骤的任何更简单的方法或教程。

tox 文档只是给出了使用 conda 的解决方案,但我没有使用 conda,也不想切换到它只是为了使用 tox

如果 Python 版本路径和别名是手动设置的,那么如果有人克隆我的项目来处理 PR 并想 运行 在本地测试,如果他们 Python 安装位置不同或它们在不同的 OS。是否有一些标准的方法来定义和设置这一切,以便所有机器之间的事情变得简单和一致?

如果这一切都无法避免,那么 tox 的替代方案是什么,可以跨多个 Python 版本持续测试可以在任何机器或 CI/CD 管道上运行的项目?

tox 实现了相当多的逻辑来查找已安装的 Python 解释器。

虽然文档缺少一些细节(也许您想创建一个问题?),但我们仍然可以查看源代码:

@tox.hookimpl
def tox_get_python_executable(envconfig):
    spec, path = base_discover(envconfig)
    if path is not None:
        return path
    # second check if the py.exe has it (only for non path specs)
    if spec.path is None:
        py_exe = locate_via_pep514(spec)
        if py_exe is not None:
            return py_exe

    # third check if the literal base python is on PATH
    candidates = [envconfig.basepython]
    # fourth check if the name is on PATH
    if spec.name is not None and spec.name != envconfig.basepython:
        candidates.append(spec.name)
    # or check known locations
    if spec.major is not None and spec.minor is not None:
        if spec.name == "python":
            # The standard names are in predictable places.
            candidates.append(r"c:\python{}{}\python.exe".format(spec.major, spec.minor))
    return check_with_path(candidates, spec)

如您所见,有五种方法可以确定 Windows 系统上可用的 Python 解释器。

特别是第二个看起来很有前途 - 它使用已经提到的 Windows 启动器 Python,另见 https://www.python.org/dev/peps/pep-0514/

据我了解,您只需安装 Python 解释器,它们将自动被发现。

tox 绝对是针对多个解释器测试 Python 应用程序的好方法,无论是在本地还是在 CI.

P.S.: 是的,它有效!!

我刚刚通过 rdp 进入 Windows 框,安装了 Python 3.8 和 Python 3.9 - 只是点击了默认安装程序,并创建了以下内容 tox.ini

[tox]
envlist = py38, py39

[testenv]
commands = python -c "print('hello')"
skip_install = true

两个解释器都被检测到,两个环境都被执行了。

(venv) C:\Users\jugmac00\Projects\Whosebug>tox
py38 create: C:\Users\jugmac00\Projects\Whosebug\.tox\py38
py38 run-test-pre: PYTHONHASHSEED='296'
py38 run-test: commands[0] | python -c 'print('"'"'hello'"'"')'
hello
py39 create: C:\Users\jugmac00\Projects\Whosebug\.tox\py39
py39 run-test-pre: PYTHONHASHSEED='296'
py39 run-test: commands[0] | python -c 'print('"'"'hello'"'"')'
hello
_______________________________________________________ summary _______________________________________________________
  py38: commands succeeded
  py39: commands succeeded
  congratulations :)

(venv) C:\Users\jugmac00\Projects\Whosebug>