Сообщение об ошибке довольно полезно - оно говорит о том, что conda не настроена должным образом изнутри оболочки, в которой выполняется ваш скрипт. Чтобы иметь возможность использовать conda внутри скрипта, вам потребуется (как сообщение об ошибке)говорит) сначала запустите conda init bash
(или какова ваша оболочка).Поведение conda и способ его настройки зависит от вашей версии conda, но причина поведения версии 4.4+ в том, что conda
зависит от определенных переменных среды, которые обычно устанавливаются самой оболочкой conda.Самое главное, эта запись в журнале изменений объясняет, почему ваши команды conda activate
и deactivate
больше не работают так, как вы ожидаете в версиях 4.4 и выше.
Подробнее об этом см. официальный выпуск conda на GitHub.
Редактировать: В еще одном исследовании говорится, что функция conda init
, упомянутая в сообщении об ошибке, на самом деле является новой функцией v4.6.0, которая позволяет быстро настроить среду, чтобы вместо нее можно было использовать conda activate
старого source activate
.Однако причина, по которой это работает, заключается в том, что он добавляет / изменяет несколько переменных среды вашей текущей оболочки, а также вносит изменения в ваш RC-файл (например: .bashrc
), а изменения RC-файла никогда не фиксируются в текущей оболочке - тольково вновь созданных снарядах.(Если, конечно, вы не получите исходный код .bashrc снова).Фактически, conda init --help
говорит так:
ВАЖНО: После запуска conda init
большинство оболочек необходимо будет закрыть и перезапустить, чтобы изменения вступили в силу
Тем не менее, вы явно уже запустили conda init
, потому что вы можете использовать conda activate
в интерактивном режиме.На самом деле, если вы откроете свой .bashrc, вы сможете увидеть несколько добавленных строк, когда conda научит вашу оболочку искать команды conda.Однако проблема с вашим сценарием заключается в том, что .bashrc не получен из подоболочки, которая запускает сценарии оболочки (для получения дополнительной информации см. этот ответ ).Это означает, что даже если ваша неинтерактивная оболочка не видит команды conda, ваши неинтерактивные сценарии подоболочки не будут - независимо от того, сколько раз вы вызываете conda init
.
Это приводит к предположению (у меня самого нет conda на Linux, поэтому я не могу его протестировать), что, запустив ваш скрипт так:
bash -i shell_script.sh
вы должны увидетьconda activate
работает правильно.Зачем?-i
- это флаг bash, который указывает оболочке, которую вы запускаете в интерактивном режиме, что означает, что он автоматически получит ваш .bashrc.Этого должно быть достаточно, чтобы позволить вам использовать conda в вашем скрипте, как если бы вы использовали его обычно.