Странная проблема при попытке заставить Rpy2 2.1.9 работать с R 2.12.1, используя Python 2.6 под Windows XP - Rpy не может найти R.dll? - PullRequest
8 голосов
/ 21 февраля 2011

У меня была реальная проблема, пытавшаяся заставить Rpy2 играть хорошо с моей R-установкой.Сначала я попытался установить MSI-пакет rpy2, но это не помогло.Когда я запускал рекомендуемые тесты, он выдавал ошибку, в которой говорилось, что он не может найти R.dll, потому что новые установки R (пост 2.11) устанавливают библиотеки DLL в папку i386, где rpy2 не может их найти, потому чтоон смотрит в папку bin вместо папки bin / i386.

Затем я попытался с нуля собрать установку, используя инструменты командной строки (distutils), входящие в состав python.Это не сработало, потому что setup.py заявил, что не может найти местоположение R_home.Но я понял, что редактирование переменной окружения (PATH) может показать настройку rpy2, где найти установку R.Затем я внес пару изменений в среду, добавив переменную "R_home", указывающую на каталог bin / i386, и сделал новую запись в переменной PATH, указывая на то же место.

К сожалению, когдаон нашел путь R, вместо этого я получил эту проблему:

running build
running build_py
running build_ext
Traceback (most recent call last):
  File "setup.py", line 372, in <module>
    [os.path.join('doc', 'source', 'rpy2_logo.png')])]
  File "C:\Python26\lib\distutils\core.py", line 152, in setup
    dist.run_commands()
  File "C:\Python26\lib\distutils\dist.py", line 975, in run_commands
    self.run_command(cmd)
  File "C:\Python26\lib\distutils\dist.py", line 995, in run_command
    cmd_obj.run()
  File "C:\Python26\lib\distutils\command\build.py", line 134, in run
    self.run_command(cmd_name)
  File "C:\Python26\lib\distutils\cmd.py", line 333, in run_command
    self.distribution.run_command(command)
  File "C:\Python26\lib\distutils\dist.py", line 994, in run_command
    cmd_obj.ensure_finalized()
  File "C:\Python26\lib\distutils\cmd.py", line 117, in ensure_finalized
    self.finalize_options()
  File "setup.py", line 111, in finalize_options
    config += get_rconfig(r_home, about)
  File "setup.py", line 264, in get_rconfig
    rc = RConfig.from_string(rconfig)
  File "setup.py", line 252, in from_string
    + '\nin string\n' + string)
ValueError: Invalid substring in string

Так что я вернулся к попытке использовать готовую установку, думая, что, возможно, новые изменения в среде могут работать, но эта проблема возникла здесь

 Traceback (most recent call last):
      File "<string>", line 245, in run_nodebug
      File "C:\Documents and Settings\User\Desktop\rpy2-2.1.9\rpy\tests.py", line 3, in <module>
        import rpy2.robjects.tests
      File "C:\Python26\lib\site-packages\rpy2\robjects\__init__.py", line 12, in <module>
        import rpy2.rinterface as rinterface
      File "C:\Python26\lib\site-packages\rpy2\rinterface\__init__.py", line 56, in <module>
        raise RuntimeError("Unable to locate R.dll within %s" % R_HOME)
    RuntimeError: Unable to locate R.dll within C:\Program Files\R\R-2.12.1\bin\i386

Это ДЕЙСТВИТЕЛЬНО странно, потому что (как любой может проверить самостоятельно) R устанавливает R.dll в "C: \ Program Files \ R \ R-2.12.1 \ bin \ i386" иЯ проверил и проверил, что это там, и я указал rpy2 на этот каталог в ПУТИ Windows по умолчанию!Я точно знаю, что rpy2 ищет в нужном месте, но не могу понять, почему он не видит R.dll.

Так почему rpy2 не может его найти?И кто-нибудь знает способ заставить rpy2 работать с R 2.12?Возможно, мне стоит попробовать более новую версию rpy2 2.2.0?Тем не менее, он все еще находится в стадии разработки, и 1,9 должен обрабатывать R 2,12 согласно этому веб-сайту , поэтому я не знаю, что делать ...

Спасибо всем, кто можетвыручить ...

[РЕДАКТИРОВАТЬ] Я также пробовал эти инструкции над здесь , но они возвращают ту же ошибку "not find DLL" ... Если вы не измените средупеременная "R_home", указывающая прямо на каталог c / program files / R / R 2.12, а не в подкаталог i386.

Если он указывает на правильное место, вы получите эти ошибки обратно.Это выглядит немного более многообещающе ... Но все равно довольно плохо!

.......................F....................................F.FFF...F....................................................................F..................................
======================================================================
FAIL: testNewWithoutInit (rpy2.rinterface.tests.test_SexpVector.SexpVectorTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\rpy2\rinterface\tests\test_SexpVector.py", line 43, in testNewWithoutInit
    self.assertTrue(False) # worked when tested, but calling endEmbeddedR causes trouble
AssertionError

======================================================================
FAIL: testCallErrorWhenEndedR (rpy2.rinterface.tests.test_EmbeddedR.EmbeddedRTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\rpy2\rinterface\tests\test_EmbeddedR.py", line 122, in testCallErrorWhenEndedR
    self.assertTrue(False) # worked when tested, but calling endEmbeddedR causes trouble
AssertionError

======================================================================
FAIL: testReadConsoleWithError (rpy2.rinterface.tests.test_EmbeddedR.EmbeddedRTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\rpy2\rinterface\tests\test_EmbeddedR.py", line 117, in testReadConsoleWithError
    self.assertTrue(errorstring.startswith('Traceback'))
AssertionError

======================================================================
FAIL: testSetReadConsole (rpy2.rinterface.tests.test_EmbeddedR.EmbeddedRTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\rpy2\rinterface\tests\test_EmbeddedR.py", line 97, in testSetReadConsole
    self.assertEquals(yes.strip(), res[0])
AssertionError: 'yes' != ''

======================================================================
FAIL: testSetWriteConsole (rpy2.rinterface.tests.test_EmbeddedR.EmbeddedRTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\rpy2\rinterface\tests\test_EmbeddedR.py", line 36, in testSetWriteConsole
    self.assertEquals('[1] "3"\n', str.join('', buf))
AssertionError: '[1] "3"\n' != ''

======================================================================
FAIL: testWriteConsoleWithError (rpy2.rinterface.tests.test_EmbeddedR.EmbeddedRTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\rpy2\rinterface\tests\test_EmbeddedR.py", line 55, in testWriteConsoleWithError
    self.assertTrue(errorstring.startswith('Traceback'))
AssertionError

======================================================================
FAIL: testVectorUnicodeCharacter (rpy2.robjects.tests.testNumpyConversions.NumpyConversionsTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\rpy2\robjects\tests\testNumpyConversions.py", line 54, in testVectorUnicodeCharacter
    self.assertTrue(False) # arrays of unicode characters causing segfault
AssertionError

----------------------------------------------------------------------
Ran 172 tests in 0.407s

FAILED (failures=7)
Exit code:  True

Ответы [ 3 ]

19 голосов
/ 26 августа 2012

После многих часов поиска в Интернете и пробных попыток, среди которых возникли те же проблемы, что и выше, я наконец-то заставил Rpy2 работать на моем компьютере с Windows 7!

По сути, пришла решающая помощьиз этой темы: http://www.mail-archive.com/rpy-list@lists.sourceforge.net/msg03348.html.

Подводя итог, это были шаги для запуска и запуска rpy2в Windows7:

  1. Установите rpy2 по этой ссылке: https://bitbucket.org/breisfeld/rpy2_w32_fix/issue/1/binary-installer-for-win32
  2. Добавьте путь к R.dll в переменную среды PATH (C: \ Program Files \ R \ R-2.12.1 \ bin \ i386 в моем случае)
  3. Добавить переменную среды R_HOME (C: \ Program Files \ R \ R-2.12.1 в моем случае)
  4. Добавить переменную средыR_USER (просто мое имя пользователя в Windows)
  5. Перезапустите вашу Python IDE (в противном случае переменные окружения не будут перезагружены!)
4 голосов
/ 21 февраля 2011

RPy2 не тестируется в Windows. Вы можете попробовать использовать более старую версию (2.0.8) с установщиком Windows, но это может иметь проблемы с более новыми версиями R.

Автор не использует Windows. Если у вас есть знания, чтобы заставить работать более новую версию для Windows, я уверен, что он приветствовал бы вклад.

2 голосов
/ 31 декабря 2013

Я не уверен, где написать это, так как я не могу комментировать (без очков репутации), но чувствую, что это полезная информация по этой проблеме. Причина обостряющегося сообщения об ошибке «Невозможно найти R.dll внутри ...», даже если вы знаете, что R.dll находится именно там, где написано, заключается в том, что программа фактически не ищет в этом каталоге. Я думаю, что соответствующее действие происходит в модуле rpy2 « init .py» в следующих строках:

import win32api
os.environ['PATH'] += ';' + os.path.join(R_HOME, 'bin', _win_bindir)
os.environ['PATH'] += ';' + os.path.join(R_HOME, 'modules', _win_bindir)
os.environ['PATH'] += ';' + os.path.join(R_HOME, 'lib')

# Load the R dll using the explicit path
R_DLL_DIRS = ('bin', 'lib')
# Try dirs from R_DLL_DIRS
for r_dir in R_DLL_DIRS:
    Rlib = os.path.join(R_HOME, r_dir, _win_bindir, 'R.dll')
    if not os.path.exists(Rlib):
        continue
    win32api.LoadLibrary( Rlib )
    _win_ok = True
    break
# Otherwise fail out!
if not _win_ok:
    raise RuntimeError("Unable to locate R.dll within %s" % R_HOME)

Как видите, в сообщении об ошибке всегда будет указано, что оно ищет в любом каталоге, который вы указали как R_HOME, но на самом деле оно будет искать в каталоге "R_HOME \ r_dir \ win_bindir". Поэтому, когда вы видите сообщение типа «Невозможно найти R.dll в C: \ Program Files \ R \ R-2.12.1 \ bin \ i386», это происходит потому, что он фактически ищет каталог с именем C: \ Program Files \ R \ R-2.12.1 \ bin \ i386 \ R-2.12.1 \ bin \ i386 \ или что-то в этом роде.

Точка 3 в ответе Кади исправляет это, оставляя путь, указанный только вниз, непосредственно выше уровня \ bin.

...