2017-10-10 1 views
1

FrageR: system() kann nicht bash Funktion definiert in Bashrc

Mein Standard-Python ist 2.7, aber ich habe ein Skript, das Python erfordert 3.4 verwenden. Ich versuche, eine Funktion in R zu erstellen, wird:

  1. Umschalten auf Python 3.4
  2. Führen Sie dieses Skript
  3. Wechseln Sie wieder zu Python 2.7
  4. Import Ergebnisse in R

zu Wechseln Sie zwischen Python-Versionen, ich verwende das "dotkit" -System meines Clusters wie folgt:

use Python-2.7 
use Python-3.4 

"Verwenden" ist eine Bash-Funktion, die in meine .bashrc-Datei importiert wird. Es setzt alle meine Pfadvariablen (PATH, LIBRARY_PATH, LD_LIBRARY_PATH, CPATH, C_INCLUDE_PATH usw.). Das Problem ist, dass wenn ich versuche, diese Funktion in R zu nennen, ich die folgende Fehlermeldung erhalten:

system('use Python-3.4') 
sh: use: command not found 

Es scheint, wie dies ein Problem mit meinem PATH ist. Ich verwende die richtige Shell:

system('echo $SHELL') 
/bin/bash 

Meine $ PATH-Variable sieht auch gut aus. Allerdings, wenn ich ein Skript erstellen, das im Wesentlichen die gleiche Sache tut:

load_py34.sh:

#!/bin/bash 
source ~/.bashrc 
use Python-3.4 

und dieses Skript durch R nennen, dann ist es tatsächlich läuft, aber aus irgendeinem Grund, es nicht ändern meine python-Version innerhalb R. (I überprüft haben, dass dieses Skript von der Kommandozeile funktioniert.)

> R 
> system('python --version') 
Python 2.7.1 
> system('sh load_py34.sh') 
Prepending: R-3.4 (ok) 
> system('python --version') 
Python 2.7.1 

Also ich bin ein wenig verwirrt, aber wenn jemand helfen kann, würde ich wirklich zu schätzen.


Empfohlene Fixes

Als ich sie in einen einzigen Befehl kombiniert, ich habe immer noch das gleiche Problem:

> system("sh load_py34.sh; python --version") 
Prepending: Python-3.4 (already loaded) 
Python 2.7.1 

Wenn es bash direkt versuchen anrufen, ich habe immer noch ein Problem mit dem PFAD:

> system("bash -c 'use Python-3.4; python --version'") 
bash: use: command not found 
Python 2.7.1 
+0

Wenn ich sie in einem einzigen Aufruf kombinieren, bekomme ich den gleichen Fehler. Ich werde die Frage aktualisieren, um dies zu berücksichtigen. –

Antwort

0

Wenn Sie 0 anrufenverwendet es /bin/sh, nicht /bin/bash. sh liest Ihre .bashrc Datei beim Start nicht, daher kennt sie keine der Funktionen, die Sie dort definiert haben.

Um die Funktion von Ihrem .bashrc zu verwenden, müssen Sie bash bekommen es statt zu laufen:

system("bash -c 'use Python-3.4; python --version'")

Edit: Platzierung von Apostroph schließen.

+0

Das gibt mir den gleichen Fehler (siehe aktualisierte Frage). –

Verwandte Themen