Ошибка при использовании источника в файле 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}