
У меня есть виртуальная машина в 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'
с двойными кавычками это не работает.