2016-04-28 4 views
0

В настоящее время я использую Python 2.7 в среде unix. мне нужно запускать сценарии R в моем питоне сценариях, но я не могу управлять, чтобы заставить его работать, потому что мой R модуль должен быть загружен до (с использованием «модуль нагрузки»)Использование подпроцесса python с загрузкой модуля

Вот мой питон скрипт:

import os 
    import subprocess as sp 

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

У меня такая же ошибка: «[Errno 2] Нет такого файла или каталога«

Любая идея? Я посмотрел here и here, но не смог заставить его работать.

Благодарим за помощь!

+0

Опубликовать всю трассировку стека. Также будьте осторожны, где находятся скрипты, как python, так и R, для удобства вы можете разместить их в одном каталоге. – gplayer

+0

Является ли test.R в вашем рабочем каталоге? –

ответ

0

Так что собственно «загрузка модуля» действительно задает некоторые переменные среды в вызывающей оболочке. Так что, когда вы это делаете:

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

Python создает процесс, работает /bin/sh в ней, и передает эту команду в оболочке. Переменные среды модуля устанавливаются в этой оболочке. Затем эта оболочка выходит - работа выполнена!

Переменные окружения не распространяются на процесс Python и не могут. Так что, когда вы это делаете:

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

Это совершенно не имеет значения, что вы запускали module load раньше.

Итак, как вы можете это исправить? Ну, одна из возможностей было бы явно указать путь к Rscript:

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

Еще бы объединить свои команды:

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

Наконец, вы можете просто запустить module load перед запуском сценария Python в первое место. Переменные среды, которые он задает, могут распространяться вплоть до вызова R в Python.

Кстати, можно ссылаться на R непосредственно из Python: http://rpy.sourceforge.net/rpy2/doc-dev/html/introduction.html

0

Он прекрасно работает с:

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

Спасибо за ваш ответ!