2016-04-28 2 views
0

Ich verwende derzeit Python 2.7 auf einer Unix-Umgebung. Ich brauche R-Skripte in meinem Python-Skripte laufen, aber ich kann nicht gelingt es, weil mein R-Modul, bevor geladen werden muss funktioniertVerwenden von Python-Subprozess mit Modul laden

Hier ist mein Python-Skript („module load“ verwenden):

import os 
    import subprocess as sp 

    os.system('module load R/3.2.3') 
    out = sp.check_output(['Rscript','test.R'], universal_newlines=True) 

Ich habe immer den gleichen Fehler: "[Errno 2] Keine solche Datei oder Verzeichnis"

Irgendeine Idee? Ich sah here und here, aber konnte es nicht funktionieren.

Vielen Dank für Ihre Hilfe!

+0

Veröffentlichen Sie den gesamten Stack-Trace. Seien Sie auch vorsichtig, wo sich die Skripte befinden, sowohl die Python- als auch die R-Einsen, denn Sie können sie alle im selben Verzeichnis ablegen. – gplayer

+0

Ist test.R in Ihrem Arbeitsverzeichnis? –

Antwort

0

Also was "Modul laden" tatsächlich tut, ist einige Umgebungsvariablen in der aufrufenden Shell gesetzt. Also, wenn Sie dies tun:

os.system('module load R/3.2.3') 

Python erstellt ein Prozess läuft /bin/sh darin und übergibt den Befehl an die Schale. Die Modulumgebungsvariablen werden in dieser Shell festgelegt. Dann endet diese Schale - Arbeit erledigt!

Die Umgebungsvariablen können nicht - und können nicht - zum Python-Prozess zurückkehren. Also, wenn Sie dies tun:

sp.check_output(['Rscript','test.R']) 

Es ist völlig irrelevant, dass Sie module load lief vor.

Also, wie können Sie das beheben? Nun, wäre eine Möglichkeit, explizit sein, um den Pfad zu Rscript angeben:

sp.check_output(['/your/full/path/to/Rscript','test.R']) 

Einem anderen wäre, Ihre Befehle zu kombinieren:

sp.check_output('module load R/3.2.3 && Rscript test.R', shell=True) 

Schließlich Sie einfach module load laufen konnten, bevor Sie Ihren Python-Skript in dem Laufe erster Platz. Die von ihm festgelegten Umgebungsvariablen können bis zum R-Aufruf in Python weitergegeben werden.

By the way, ist es möglich, R aus Python direkt aufzurufen: http://rpy.sourceforge.net/rpy2/doc-dev/html/introduction.html

0

Es arbeitet perfekt mit:

sp.check_output('module load R/3.2.3 && Rscript test.R', shell=True) 

Vielen Dank für Ihre Antwort!