Активация среды conda через SSH

Активация среды conda через SSH

У меня есть виртуальная машина в Azure, где после подключения по ssh я могу без проблем запустить Conda и Python:

conda activate py36
python some_script.py

Чтобы запустить эти команды с моей машины через SSH, мне нужно указать полный путь к Conda:

ssh ${USER}@${IP} "/data/anaconda/envs/py35/bin/conda activate py36; python some_script.py"

но я получаю эту ошибку:

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'.

Тем не менее, оболочка работает так bash:

$ sshb ${USER}@${IP} echo $SHELL
/bin/bash

Как можно активировать среду conda удаленно через SSH?

решение1

Редактировать: В процессе работы над этим я обнаружил, что conda initсоздает функцию под названием "conda", которая маскирует исполняемые файлы conda. Смотрите type conda. Что позволяет ему устанавливать переменные окружения в текущей оболочке. Это важно, поскольку это способствует возникновению проблемы.

При запуске команды через ssh не запускается файл ~/.bashrc, который настраивает эту condaфункцию bash.

Итак, мой окончательный ответ для вас:

ssh ${USER}@${IP} ". ~/.bashrc ; conda activate py36; python some_script.py"

. ~/.bashrcпросто вызывает ~/.bashrc, который предоставляет функцию conda, если вы уже запускали ее conda initранее.

Старый ответ

Я бы предложил вам создать скрипт оболочки с кодом активации и Python.

# job.sh
conda activate py36
python some_script.py

Сделать запускаемым с помощьюchmod +x job.sh

Затем запустите удаленно следующую команду:

ssh ${USER}@${IP} bash -l "<relative path to script on remote machine>"

bash -lделает его оболочкой входа, которая также позволяет вам использовать свой .bash_profileили .bashrcчто означает, что вам не нужно будет указывать полный путь.

Если вам абсолютно необходима одна команда, используйтехередок.

ssh ${USER}@${IP} bash -l <<HERE
conda activate py36
python some_script.py
HERE

Я пробовал и другие способы, но, похоже, есть некоторая проблема с тем, как bash сохраняет изменения среды при разделении команд. Conda activate устанавливает различные переменные среды (с префиксом CONDA и переменной PATH).

решение2

Вместо указания пути к «conda» мне удобнее указать путь к «activate» следующим образом:

ssh [host] "source ~/anaconda3/bin/activate [name of conda env] ; cd [pick a dir] ; [command]"

Для [команда] попробуйте "conda env list", чтобы увидеть, какая среда активирована. Или вы можете сделать "python foo.py".

Возможно, вам придется изменить путь "~/anaconda3/bin/activate".

решение3

Собрано из этогопроблемаМне удалось решить эту проблему, добавив следующие строки в свой файл .bashrc:

export -f conda 
export -f __conda_activate 
export -f __conda_reactivate 
export -f __conda_hashr 
export -f __add_sys_prefix_to_path 
eval "$(conda shell.bash hook)"

Я не уверен, exportнужны ли еще буквы s в evalрешении, но они ничего не сломали, поэтому я просто оставил их.

EDIT: также важно помнить, что любой скрипт, condaкаким-либо образом использующий , должен быть запущен с помощью bashинет sh.

решение4

Просто дополнение к ответу @Maeve Kennedy. Вместо использования двойных кавычек лучше использовать одинарные, как ниже

ssh ${USER}@${IP} '. ~/.bashrc ; conda activate py36; python some_script.py'

Позволяет выполнить любую команду bash после удаленной активации среды conda. Что-то вроде ниже;

ssh ${USER}@${IP} '. ~/.bashrc ; conda activate py36; echo $CONDA_PATH'

с двойными кавычками это не работает.

Связанный контент