在python Tox ini文件中使用source时出错

时间:2014-07-18 19:47:27

标签: python-2.7 automated-tests conda tox

我正试图让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 repo。 有什么想法吗?

2 个答案:

答案 0 :(得分:8)

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

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

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

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

{toxworkdir}/conda/bin/py.test --basetemp={envtmpdir}

答案 1 :(得分:8)

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

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

接下来,我尝试使用setenv tox部分来更改路径。这导致了鸡肉和鸡肉。鸡蛋问题。在运行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环境是多么困难,但它对我有用。