在virtualenv中安装依赖项后运行命令的推荐方法

时间:2016-05-12 13:02:01

标签: virtualenv tox

我想使用 tox 在项目上运行 py.test ,除了将软件包安装到virtualenv之外,还需要额外的设置。在创建virtualenv并安装依赖项之后,需要运行一些命令。

具体来说,我正在谈论使用nodeenv设置节点 npm 环境:

nodeenv --prebuilt -p

我看到tox允许我通过在tox.ini中设置install_command来提供用于安装依赖项的自定义命令。但我认为这不是我想要的,因为替换用于安装依赖项的命令(我假设pip)。

我考虑过使用带有 session 范围的py.test fixture来处理设置nodeenv,但这对我来说似乎很难,因为我不想在直接运行py.test时发生这种情况,不是通过tox。

实现这一目标的最简单方法是什么?

2 个答案:

答案 0 :(得分:3)

commands中创建virtualenv和依赖项安装后,您可以进行所有必要的设置。是的,它说"要调用的命令。"但是如果你需要做额外的工作来准备测试,你可以在那里做。

它按照给出的顺序通过你投掷的任何东西 - 例如:

  [testenv:someenv]
  deps = 
    nodeenv
    pytest
    flexmock
  commands =
     nodeenv --prebuilt -p
     ; ... and whatever else you might need to do
     py.test path/to/my/tests

如果您有命令/脚本或其他任何产生正确结果的但却返回非零退出状态,您可以通过预先-(如- naughty-command中)来忽略它。

如果您需要执行更多步骤,可以将它们包装在一个小的(Python)脚本中,并按https://stackoverflow.com/a/47834447/2626627中所述调用该脚本。

添加使用多个安装命令的能力也存在问题:https://github.com/tox-dev/tox/issues/715已实施。

答案 1 :(得分:2)

我遇到了同样的问题,因为能够在不调用测试的情况下创建环境非常重要(通过--notest),我希望安装在安装阶段进行而不是运行阶段,所以我做了一些略有不同的事情。首先,我创建了一个create-env脚本:

#!/usr/bin/env sh

set -e

pip install $@
nodeenv --prebuilt --python-virtualenv --node=8.2.1

使其成为可执行文件,然后在tox.ini中:

[tox]
skipsdist = True

[testenv]
install_command = ./create-env {opts} {packages}
deps = nodeenv
commands = node --version

此完整示例运行并输出以下内容:

$ tox
python create: .../.tox/python
python installdeps: nodeenv
python installed: nodeenv==1.3.0
python runtests: PYTHONHASHSEED='1150209523'
python runtests: commands[0] | node --version
v8.2.1
_____________________________________________________________________ summary ______________________________________________________________________
  python: commands succeeded
  congratulations :)

这种方法的缺点是它只适用于Unix。

tox 715中,我提出了对多个安装命令的原生支持的可能性。