13

我正在努力让 Tox 和 Conda 一起玩得很好。主要是因为我有很多非 python 依赖项需要安装,而且很容易创建 Conda 发行版。然后我可以用一个简单的conda install.

但是,我无法激活 conda 环境。

[tox]
envlist = py27

[testenv]
whitelist_externals =
    conda
    source
    py.test
setenv =
    PYTHONPATH = {toxinidir}:{toxinidir}/damlarces
install_command =
    python build_env.py --conda-env {toxworkdir}/conda {packages}
commands =
    source activate {toxworkdir}/conda
    py.test --basetemp={envtmpdir}

python build_env.py --conda-env {toxworkdir}/conda {packages}负责创建环境(如果需要)、安装软件包等。问题就在于此source activate {toxworkdir}/conda。我得到一个ERROR: InvocationError: could not find executable 'source'错误。直接在命令行中输入命令可以正常工作。

对于那些有兴趣的人。在build_env.py这个要点中:https ://gist.github.com/JudoWill/70450979353fa2d12823 ...目前它只是安装 Python 依赖项,但在其预期的环境中它将安装不一定是 Python 库的 Conda 存储库。有什么想法吗?

4

2 回答 2

8

source不是命令。这是一个内置的shell。source script.sh导致script.sh在当前 shell 中运行。这是必要的activate,因为它修改了 PATH,并且您希望这些修改影响 shell 本身(通常,当您运行脚本时,它在子 shell 中运行,它有自己的环境,不会影响调用 shell 的环境)。

我不知道 tox 是否支持在命令中设置环境变量。如果是这样,您可以使用

export PATH={toxworkdir}/conda/bin:$PATH

否则,只需使用所有命令的绝对路径,例如

{toxworkdir}/conda/bin/py.test --basetemp={envtmpdir}
于 2014-07-21T16:03:03.040 回答
8

经过大量的修补,我想出了一个解决方法。它可能对 Tox 的任何更改都很脆弱,但只要他们按照提供的顺序运行测试,envlist它就应该可以工作。

正如@asmeurer 在他的回答中所建议的那样,诀窍是以某种方式改变PATHtox 所识别的。但为了生成conda/bin我需要运行conda create. 首先,我尝试使用export PATH={toxworkdir}/conda/bin:$PATHasmeurer 的建议,但这遇到了同样的InvocationError问题,只是使用export而不是source.

接下来,我尝试使用setenvtox 部分来更改路径。这导致了鸡和蛋的问题。在运行命令之前,我无法添加bin目录。conda create由于 Tox 中命令的默认顺序,我似乎无法setenvinstall_command.

我想出的解决方法是创建一个新env的测试环境,然后与后续测试共享这个环境。

[tox]
envlist = setup,py27

[testenv]
whitelist_externals =
    conda
    source
    py.test

[testenv:setup]
setenv =
    PYTHONPATH = {toxinidir}:{toxinidir}/damlarces
commands =
    conda config --add channels judowill
    python build_env.py --conda-env {toxworkdir}/conda {packages}

[testenv:py27]
setenv =
    PYTHONPATH = {toxinidir}:{toxinidir}/damlarces
    PATH={toxworkdir}/conda/bin:$PATH
commands =
    {toxworkdir}/conda/bin/py.test --basetemp={envtmpdir}

这行得通。我不确定将其推广到多个 python 环境会有多困难,但它对我有用。

于 2014-07-22T13:56:36.837 回答