Как я могу загрузить конкретную установку R сервера (модуль среды) при запуске локальной установки emacs?

Я использую кластер с модулями среды. Это означает, что я должен специально загрузить любую версию R, отличную от версии по умолчанию (2.13), поэтому для загрузки R 3.0.1 я должен указать

module load R/3.0.1
R

Я добавил module load R/3.0.1 к .bashrc, так что если я подключаюсь к серверу по ssh и загружаю R, он по умолчанию открывает 3.0.1. Но когда я открываю R на сервере (M-x R, начальный каталог данных: /ssh:myserver), он загружает установку R по умолчанию (2.13).

Этот вопрос аналогичен предыдущим вопросам, за исключением того, что я получаю доступ к R на сервере, используя локальную установку emacs. (ESS для вызова разных установок R и Как указать версию R, открытую сеансом ESS в emacs?)


person David LeBauer    schedule 01.10.2013    source источник


Ответы (2)


TL;DR

  1. Определите путь к модулю R: module show R/3.0.1
  2. добавьте в свой .emacs: (add-to-list 'tramp-remote-path "/path/to/R-3.0.1/bin")

bash, вызываемый TRAMP через ssh, действительно выполняет свои файлы инициализации, но какие файлы в конечном итоге будут выполнены, зависит от нескольких вещей. Вы можете проверить, выполняется ли ваш ~/.bashrc вообще, когда вы используете TRAMP для подключения к серверу, добавив что-то вроде echo "bashrc here" в файл. Затем установите переменную

(setq tramp-verbose 9)

и попробуйте подключиться. Теперь посмотрите, сможете ли вы обнаружить это сообщение в буфере с именем *debug tramp/ssh...*.

Если у вас нет дополнительных настроек, TRAMP вызывает удаленную оболочку как /bin/sh (http://www.gnu.org/software/tramp/#Remote-shell-setup), поэтому bash выполнит /etc/profile и ~/.profile (http://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files). Вы также можете увидеть, как оболочка вызывается в этом буфере *debug tramp/ssh...*, соответствующая строка будет

tramp-open-shell (5) # Opening remote shell `/bin/sh'...done

Попробуйте сначала добавить module load R/3.0.1 к ~/.profile. Если это не поможет, попробуйте заставить TRAMP вызывать bash по его имени, установив

(setq explicit-shell-file-name "bash")
(setq shell-file-name "bash")

ОБНОВЛЕНИЕ: Если ничего не помогает, вы можете просто открыть оболочку M-x shell, а затем подключиться по ssh к вашему серверу, который должен позаботиться о правильной инициализации модулей (потому что вы упомянули, что интерактивное соединение ssh работает должным образом). Оказавшись на сервере, запустите R, а затем выполните M-x ess-remote, чтобы сообщить ESS о существующем сеансе R. Таким образом, вы вообще не полагаетесь на TRAMP.

person Alex Vorobiev    schedule 28.10.2013
comment
спасибо за подсказки, но я все еще не понимаю, как заставить это работать. У меня есть «загрузка модуля R/3.0.1» как в моем .profile, так и в .bashrc, но, похоже, это не помогает. - person David LeBauer; 08.11.2013
comment
Пробовали ли вы добавить отладочные сообщения в .profile, .bash_profile и/или .bashrc, а затем проверить буфер *debug tramp/ssh..*, чтобы убедиться, что файлы выполняются после установления соединения? - person Alex Vorobiev; 09.11.2013
comment
Под отладочным сообщением вы имеете в виду добавление строки типа echo 'bashrc load? - person David LeBauer; 10.11.2013
comment
да, и аналогичные сообщения для других файлов, чтобы увидеть, какие из них загружаются. - person Alex Vorobiev; 11.11.2013
comment
Ладно. Итак, он читает мой .bashrc, но когда я открываю R, он игнорирует команду module load R/3.0.1, хотя эта строка работает, как и ожидалось, при запуске R на удаленной машине из оболочки bash. - person David LeBauer; 11.11.2013
comment
module должен изменять среду. Если по какой-то причине не работает под TRAMP, можно попробовать добавить путь к правильному R: (add-to-list 'tramp-remote-path "/path/to/R-3.0.1/bin") - person Alex Vorobiev; 12.11.2013
comment
Я только что добавил альтернативный метод использования правильного R, который использует вашу рабочую конфигурацию ssh и не полагается на TRAMP. - person Alex Vorobiev; 14.11.2013
comment
Этот ответ избавил меня от необходимости задавать аналогичный вопрос, спасибо! - person Alex Shroyer; 01.08.2019
comment
По умолчанию TRAMP не будет использовать PATH, созданный .profile, если только вы явно не укажете ему это сделать. См. этот ответ для решения. - person Daniel Kessler; 14.04.2020

Когда TRAMP запускает команду оболочки на удаленном хосте, она вызывает /bin/sh -c. Кажется, нет способа указать sh на источник каких-либо файлов при инициализации, когда он вызывается таким образом. Так что давайте вместо этого настроим TRAMP для вызова /bin/bash -c. Затем bash будет источником BASH_ENV, который мы можем указать на пользовательский файл, который настраивает модули.

Итак, сначала настройте TRAMP для использования /bin/bash. Для этого нам нужно изменить переменную tramp-methods. Это список, где ключами являются строки, обозначающие тип соединения. Я использую тип подключения "scpx", но вы можете изменить его на любой другой тип подключения.

(let ((scpx-method (cdr (assoc "scpx" tramp-methods))))
      (add-to-list 'scpx-method '(tramp-remote-shell "/bin/bash"))
      (add-to-list 'tramp-methods (cons "scpx" scpx-method)))

Затем мы можем настроить tramp-remote-process-environment так, чтобы он указывал на файл, который будет содержать конфигурацию нашего модуля.

(add-to-list 'tramp-remote-process-environment "BASH_ENV=~/.bash_env")

Затем откройте файл ~/.bash_env на удаленном компьютере. Вам понадобятся исходные файлы, которые настраивают вашу модульную систему. Мы используем другую модульную систему, поэтому я не совсем уверен, какой файл вам понадобится, но, возможно, вы найдете его в /etc/profile.d. Вот что содержит мой файл:

source /etc/profile.d/z00_lmod.sh
module -q restore

Опять же, я не знаком с вашей системой модулей, но вторая строка просто загружает мой набор модулей по умолчанию.

Наконец, поскольку система модулей настраивает ваш PATH, нам нужно заставить TRAMP использовать его. По умолчанию TRAMP просто использует содержимое файла tramp-remote-path. Но если вы добавите tramp-own-remote-path, будет загружено содержимое PATH.

(add-to-list 'tramp-remote-path 'tramp-own-remote-path)
person Daniel Matz    schedule 14.12.2017