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

Jud*_*ill 12 automated-tests python-2.7 tox conda

我想让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}
Run Code Online (Sandbox Code Playgroud)

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.有什么想法吗?

asm*_*rer 8

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

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

export PATH={toxworkdir}/conda/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

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

{toxworkdir}/conda/bin/py.test --basetemp={envtmpdir}
Run Code Online (Sandbox Code Playgroud)


Jud*_*ill 8

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

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

接下来,我尝试使用setenvtox部分来更改路径.这导致鸡和鸡蛋问题.在bin运行conda create命令之前,我无法添加目录.由于Tox中命令的默认顺序,似乎我不能在之后得到setenv差异(或重新运行)install_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}
Run Code Online (Sandbox Code Playgroud)

这有效.我不确定将它推广到多个python环境是多么困难,但它对我有用.