如何在其他环境中运行 tox -e myenv ?

Swi*_*Run 5 python continuous-integration automated-tests pytest tox

tox 中是否可以触发tox -e hellohello 环境并在全局环境列表上运行?

运行tox针对 py2 和 py3 正确运行。

运行tox -e hello仅针对 py3 运行。

[tox]
skipsdist = True
envlist = py{27,37}

[testenv]
deps =
    pytest
    !py27: mock
commands =
    {envpython} --version

; How to run this hello against the complete envlist?
[testenv:hello]
envlist = py{27,37}
commands =
    echo hello
Run Code Online (Sandbox Code Playgroud)

似乎这在某种程度上是预期的行为,但除了制作一堆 tox 文件之外,我不知道如何使用 tox 来解决问题:我想要有不同的 tox 命令入口点。例如,仅针对 运行单元测试py27,仅针对 运行单元测试py{27,37},仅针对 运行集成测试py27-{libA,libB},等等。

也许这只是一种反模式,您可以在单个环境中以这种方式使用 tox -e ,但它会破坏 envlist ?

我只需要再制作一个 tox.ini 吗?考虑到与 tox 有关的其他所有内容的灵活性和重用性,这似乎非常笨拙。我觉得我失去了一些东西。

Oli*_*ter 6

这里有两点主要需要理解:

  1. envlist是该部分中的全局设置[tox]。定义它[testenv:hello]没有效果
  2. envlist定义或生成名称列表env。这可以通过提供一个简单的逗号分隔列表静态地完成,或者像您一样从通过特殊语法提供的因素组合生成列表{...}两种情况的结果都是环境名称列表,然后将在分隔的virtualenvs/中执行venvs

因此,为了完全清楚地表明:最终 anenvlist是一个简单的名称列表env- 没有其他。对这些名称(或其部分(又名因子))所做的操作是在envs.

如果您在不带 .txt 的情况下调用 tox,则会执行所有这些环境-e。在您的示例中,您使用的语法生成一个 envlist{<factorX>,<factorY>},该语法基于与命令行 shell 提供的相同原理。如果您在 tox 配置中询问生成的环境,结果将是:

$ tox -a

py27-hello
py37-hello
hello
Run Code Online (Sandbox Code Playgroud)

这可能已经表明您的配置有点不对劲,因为我认为您不想要一个不合格的hello环境。

因此,您通过生成地创建 envlist 并hello使用[testenv:hello]语法静态提供 testenv 所做的事情是以一种不会产生您想要的结果的方式混合它们。

因此,让我们调整您的内容tox.ini以摆脱不必要的静态定义testenv:hello。我们还摆脱了本地envlist密钥,因为它无论如何都没有效果。它没有抛出错误,因为任意命名的键envs是明确允许的并且有时很有用。

[tox]
skipsdist = True
envlist = py{27,37}-hello

[testenv]
deps =
    pytest
    !py27: mock
# do not warn that echo is a command not in the venv
whitelist_externals = echo
commands =
    {envpython} --version
    hello: echo hello
Run Code Online (Sandbox Code Playgroud)

为了确保仅运行 hello 命令,当 env 具有一个hello因子时,您可以使用<factor>[,<factor>]: <some command>它来指定如果 env 名称包含某个因子(由 分隔的名称部分-)应运行的内容,则会生成一个环境名称列表,其中然后作为正在执行的具体环境的信息。

如果我tox -a再次调用更改后的 ini,我会得到:

py27-hello
py37-hello
Run Code Online (Sandbox Code Playgroud)

现在我可以通过调用eg来请求完整的环境或仅获取因子tox -e py27-hello,甚至然后tox -e hello它将使用basepython并执行适合因子的所有操作。

为了更深入地了解正在发生的情况,您可以显示所有环境的完全解析的配置,如下所示:

$ tox --showconfig

[testenv:py27-hello]
  envdir          = /home/ob/do/play/.tox/py27-hello
  setenv          = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py27-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py27-hello'}
  basepython      = python2.7
  description     = 
  envtmpdir       = /home/ob/do/play/.tox/py27-hello/tmp
  envlogdir       = /home/ob/do/play/.tox/py27-hello/log
  downloadcache   = None
  changedir       = /home/ob/do/play
  args_are_paths  = True
  skip_install    = False
  ignore_errors   = False
  recreate        = False
  passenv         = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
  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            = [pytest]
  commands        = [['/home/ob/do/play/.tox/py27-hello/bin/python', '--version'], ['echo', 'hello']]
  commands_pre    = []
  commands_post   = []
  ignore_outcome  = False
  extras          = []
  depends         = ()
  parallel_show_output = False
[testenv:py37-hello]
  envdir          = /home/ob/do/play/.tox/py37-hello
  setenv          = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py37-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py37-hello'}
  basepython      = python3.7
  description     = 
  envtmpdir       = /home/ob/do/play/.tox/py37-hello/tmp
  envlogdir       = /home/ob/do/play/.tox/py37-hello/log
  downloadcache   = None
  changedir       = /home/ob/do/play
  args_are_paths  = True
  skip_install    = False
  ignore_errors   = False
  recreate        = False
  passenv         = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
  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            = [pytest, mock]
  commands        = [['/home/ob/do/play/.tox/py37-hello/bin/python', '--version'], ['echo', 'hello']]
  commands_pre    = []
  commands_post   = []
  ignore_outcome  = False
  extras          = []
  depends         = ()
  parallel_show_output = False
[testenv:hello]
  envdir          = /home/ob/do/play/.tox/hello
  setenv          = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/hello'}
  basepython      = /usr/bin/python
  description     = 
  envtmpdir       = /home/ob/do/play/.tox/hello/tmp
  envlogdir       = /home/ob/do/play/.tox/hello/log
  downloadcache   = None
  changedir       = /home/ob/do/play
  args_are_paths  = True
  skip_install    = False
  ignore_errors   = False
  recreate        = False
  passenv         = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
  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            = [pytest, mock]
  commands        = [['/home/ob/do/play/.tox/hello/bin/python', '--version'], ['echo', 'hello']]
  commands_pre    = []
  commands_post   = []
  ignore_outcome  = False
  extras          = []
  depends         = ()
  parallel_show_output = False
Run Code Online (Sandbox Code Playgroud)

  • 这是完美的,也是我所需要的!“hello: echo hello”部分是我摸索的关键部分以及正确的方法。感谢您的 showconfig,这非常有帮助! (2认同)