我正试图让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。
有什么想法吗?
答案 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中命令的默认顺序,我似乎无法让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}
这很有效。我不确定将它推广到多个python环境是多么困难,但它对我有用。