Ошибка при использовании источника в файле tox ini python

Я пытаюсь заставить Токса и Конду хорошо играть вместе. В основном потому, что у меня есть много зависимостей, отличных от 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 находится в этом Gist: https://gist.github.com/JudoWill/70450979353fa2d12823... В настоящее время он просто устанавливает зависимости Python, но в своей предполагаемой среде он будет устанавливать Conda репо, которые не обязательно являются библиотеками python. Любые мысли?

Ответ 1

После многих попыток я разобрался в работе. Вероятно, он хрупкий для любых изменений в Tox, но пока они запускают тесты в порядке, указанном envlist, тогда он должен работать.

Как было предложено @asmeurer в его ответе, трюк заключается в том, чтобы как-то изменить PATH, как это признал ток. Но для создания conda/bin мне нужно запустить conda create. Во-первых, я попытался использовать export PATH={toxworkdir}/conda/bin:$PATH, предложенный asmeurer, но это столкнулось с тем же вопросом 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-окружение, но оно работает для меня.

Ответ 2

source не является командой. Это оболочка встроена. source script.sh вызывает script.sh для запуска внутри текущей оболочки. Это необходимо для activate, поскольку оно изменяет PATH и вы хотите, чтобы эти изменения влияли на оболочку (обычно, когда вы запускаете script), она выполняется в подоболочке, которая имеет свою собственную среду, которая не может влиять на вызов оболочки оболочки).

Я не знаю, поддерживает ли ток настройки переменных среды в командах. Если это так, вы можете просто использовать

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

В противном случае просто используйте абсолютный путь ко всем вашим командам, например

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