2014-07-18 44 views
10

我试图让Tox和Conda很好地一起玩。主要是因为我需要安装很多非python依赖项,并且很容易创建Conda分发版。然后,我可以用简单的conda install安装所有东西。在python Tox ini文件中使用源代码时出错

但是,我在激活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是在这个Gist:https://gist.github.com/JudoWill/70450979353fa2d12823 ...目前它只是安装Python依赖项,但在其预期的环境中,它将安装Conda repo的,不一定是python库。 有什么想法?

+0

我既不知道conda也没有tox,但是因为你似乎可以通过这种方式执行python脚本,难道你不能编写一个脚本来将这个调用包装成'source',类似于'build_env.py'吗? –

+0

试过了。由于Tox的工作方式,shell在运行的'install_command'和'commands'部分之间丢失。我也试图将这两个'commands'封装成一个bash脚本。这也给和'InvocationError'。 – JudoWill

+0

你可以显示'build_env.py'里面的内容吗?谢谢。 – alecxe

回答

7

大量的修修补补我想出了一个变通后。它可能对Tox的任何变化都很脆弱,但只要他们按照envlist提供的顺序运行测试,那么它应该可以工作。

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

接下来,我尝试使用setenv tox部分来更改路径。这导致了一个鸡蛋问题。在我运行conda create命令之前,我无法添加bin目录。由于Tox中命令的默认顺序,看起来好像我不能在install_command之后得到setenv不同(或重新运行)。

我想出的解决方法是创建一个新的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环境是多么困难,但它适用于我。

6

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

程序运行后会重置路径吗? – JudoWill

+0

'PATH'只能在本地设置为tox。无论何时你改变程序或脚本中的环境变量,它只会影响该程序的环境,而不会影响你的shell(例外情况是,如果你有一个bash脚本,你用'source'调用)。 – asmeurer

+0

没有骰子。现在我在'export'命令中得到一个调用错误。 '错误:InvocationError:无法找到可执行文件'export'' – JudoWill

相关问题