Python - активировать conda env через скрипт - PullRequest
5 голосов
/ 04 апреля 2019

Я надеюсь запустить простой скрипт оболочки, чтобы упростить управление в некоторых средах conda.Активация среды conda с помощью conda activate в linux os прекрасно работает в оболочке, но проблематична в сценарии оболочки.Может ли кто-нибудь указать мне правильное направление относительно того, почему это происходит?

Пример повторения вопроса:

# default conda env
$ conda info|egrep "conda version|active environment"
     active environment : base
          conda version : 4.6.9

# activate new env to prove that it works
$ conda activate scratch
$ conda info|egrep "conda version|active environment"
     active environment : scratch
          conda version : 4.6.9

# revert back to my original conda env
$ conda activate base 

$ cat shell_script.sh
#!/bin/bash
conda activate scratch

# run shell script - this will produce an error even though it succeeded above
$ ./shell_script.sh

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run

    $ conda init <SHELL_NAME>

Currently supported shells are:
  - bash
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell

See 'conda init --help' for more information and options.

IMPORTANT: You may need to close and restart your shell after running 'conda init'.

Ответы [ 2 ]

4 голосов
/ 04 апреля 2019

Сообщение об ошибке довольно полезно - оно говорит о том, что 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 в вашем скрипте, как если бы вы использовали его обычно.

1 голос
/ 02 июля 2019

Я использую 'source command' для запуска сценария оболочки, он работает:

source shell_script.sh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...