RStudio не загружает все модули Python через вызов rPython

У меня есть некоторые неожиданные поведения, запускающие один и тот же скрипт из Bash и из RStudio.

Пожалуйста, учтите следующее. У меня есть папка "~/rpython" содержащий два скрипта:

# test1.R

library(rPython)

setwd("~/rpython")

python.load("test1.py")

number <- python.get("number")
string <- python.get("string")

print(sqrt(number))
print(string)

а также

# test1.py

import random, nltk

number = random.randint(1, 1000)

string = nltk.word_tokenize('home sweet home')

Я могу вызвать мой R скрипт из Bash с Rscript test1.R, который возвращается, как ожидалось

>> Loading required package: RJSONIO
>> [1] 13.0384
>> [1] "home"  "sweet" "home"

и если я позвоню еще раз, я получу другое случайное число

>> Loading required package: RJSONIO
>> [1] 7.211103
>> [1] "home"  "sweet" "home" 

Но когда я запускаю тот же скрипт (test1.R) из RStudio дела обстоят странно. Здесь вывод

# test1.R
> 
> library(rPython)
Loading required package: RJSONIO
> 
> setwd("~/rpython")
> 
> python.load("test1.py")
Error in python.exec(code, get.exception) : No module named nltk
> 
> number <- python.get("number")
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'number' is not defined
Error in python.get("number") : Variable not found
> string <- python.get("string")
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'string' is not defined
Error in python.get("string") : Variable not found
> 
> print(sqrt(number))
Error in print(sqrt(number)) : object 'number' not found
> print(string)
Error in print(string) : object 'string' not found

По какой-то причине, когда я вызываю скрипт из RStudio, интерпретатор Python не может найти модуль nltk (похоже, то же самое с другими pip установленные модули), но не имеет проблем с импортом random,

1 ответ

У меня тоже была эта пробема. Проблема заключалась в том, что мой bash-терминал, похоже, вызывает другой питон, чем тот, что есть в Rstudio. Я также узнал, что если вы пытаетесь вызвать только Python.load() из rPython, вам, вероятно, лучше использовать system() из базовой библиотеки R.

  1. Выясните, какой Python вызывает ваш bash-терминал. Зайдите в свой терминал bash и запустите which python, Для меня (OS X 10.11.5) это было /usr/local/bin/python, Теперь, когда мы знаем полный путь, мы можем явно его назвать и запретить R выбирать другую версию, которая может быть установлена ​​в каком-то уголке вашего компьютера.
  2. использование system() вызывать команды bash из R вместо python.load()и используйте полный путь к вашему сценарию. Используя имя вашего примера сценария и мой пример пути Python, это будет system('/usr/local/bin/python /path/to/file/test.py1')

Надеюсь, это поможет!

Другие вопросы по тегам