Как мога да заредя специфична 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")

АКТУАЛИЗАЦИЯ: Ако всичко друго се провали, можете просто да отворите shell M-x shell, след това ssh към вашия сървър, който трябва да се погрижи за правилната инициализация на модулите (защото споменахте, че интерактивната ssh връзка работи според очакванията). След като сте на сървъра, стартирайте R и след това направете M-x ess-remote, за да уведомите ESS за съществуващата R сесия. По този начин изобщо не разчитате на TRAMP.

person Alex Vorobiev    schedule 28.10.2013
comment
благодаря за съветите, но все още не виждам как да накарам това да работи. Имам „module load 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 loaded? - person David LeBauer; 10.11.2013
comment
да, и подобни съобщения към други файлове, за да видите кой(ите) се зареждат. - person Alex Vorobiev; 11.11.2013
comment
добре. Така че той чете моя .bashrc, но когато отворя R, той игнорира командата module load R/3.0.1, въпреки че този ред работи според очакванията при стартиране на R на отдалечената машина от bash shell - 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 изпълни команда на shell на отдалечения хост, тя извиква /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