【问题标题】:Bizzarre issue trying to make Rpy2 2.1.9 work with R 2.12.1, using Python 2.6 under Windows xp - Rpy can't find the R.dll?在 Windows xp 下使用 Python 2.6 尝试使 Rpy2 2.1.9 与 R 2.12.1 一起工作的奇怪问题 - Rpy 找不到 R.dll?
【发布时间】:2011-07-01 10:11:24
【问题描述】:

我在尝试让 Rpy2 与我的 R 安装配合使用时遇到了一个真正的问题。我首先尝试安装 rpy2 MSI 软件包,但这似乎不起作用。当我运行推荐的测试时,它给了我一个错误,说它找不到 R.dll,因为新的 R 安装(2.11 后)将 DLL 安装到 i386 文件夹中,rpy2 找不到它们,因为它在 bin 文件夹而不是 bin/i386 文件夹中查找。

然后我尝试使用 python 附带的命令行工具 (distutils) 从头开始​​构建安装。这不起作用,因为 setup.py 声称无法找到 R_home 位置。但我确实发现编辑环境变量 (PATH) 可能会显示 rpy2 设置在哪里可以找到 R 安装。然后我对环境进行了一些编辑,添加了指向 bin/i386 目录的“R_home”变量,并在 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 版本?不过它仍在开发中,根据website,1.9 应该能够处理 R 2.12,所以我不知道该怎么办......

感谢任何可以提供帮助的人...

[编辑] 我也在here 上尝试过这些指令,但它们返回相同的“找不到 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

【问题讨论】:

    标签: python windows r windows-xp rpy2


    【解决方案1】:

    我不确定在哪里写这篇文章,因为我无法发表评论(没有声誉积分),但我觉得这是关于这个问题的有用信息。即使您知道 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”。因此,当您看到类似“无法在 C:\Program Files\R\R-2.12.1\bin\i386 中找到 R.dll”这样的消息时,那是因为它实际上是在寻找一个名为 C:\Program Files\ 的目录R\R-2.12.1\bin\i386\R-2.12.1\bin\i386\,或者类似的东西。

    Kadee 回答中的第 3 点通过将指定的路径仅保留到 \bin 级别之上来解决此问题。

    【讨论】:

      【解决方案2】:

      在网上搜索了几个小时并尝试了许多不同的东西,其中遇到了与上述相同的问题,我终于让 Rpy2 在我的 Windows 7 计算机上运行!

      基本上,关键的帮助来自这个帖子:http://www.mail-archive.com/rpy-list@lists.sourceforge.net/msg03348.html

      总结一下,这些是在 Windows7 上启动并运行 rpy2 的步骤:

      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(否则不会重新加载环境变量!)

      【讨论】:

      • 如果您不知道如何添加/更改环境变量,请查看例如这里:computerhope.com/issues/ch000549.htm
      • 这是一个很棒的解决方案。 WIN7 它有助于在测试调用 R 之前设置环境变量后重新注销和重新登录。这也适用于 64 位机器的 rpy2。 Win 安装程序在这里lfd.uci.edu/~gohlke/pythonlibs
      • 太棒了!适用于 R-3.1.0、Windows 7 64 位、Python 2.7.6
      • 此解决方案不适用于我,在 R 3.0.1、Enthought Python 2.7.3 64 位、Win 7 64 位下。
      【解决方案3】:

      RPy2 未在 Windows 上进行测试。您可以尝试将older version (2.0.8) 与 Windows 安装程序一起使用,但对于较新版本的 R 可能会有问题。

      作者不使用 Windows。如果您具备在 Windows 上运行更新版本的知识,我相信他会欢迎您的贡献。

      【讨论】:

      • 我希望我做到了,但不幸的是我的编程知识绝对为零!我实际上是在尝试使用 rpy 和 R 来学习一些编程技能……
      • @Kingdom:很公平。我今天早些时候问过 Laurent,他说可能需要几个小时的工作。但显然他有一台新的 Windows 机器,所以请留意 2.2 版。
      • 啊,这是个好消息!我只需要继续使用当前版本并尝试解决我猜出现的任何问题。
      • 这有什么更新吗?我真的很想在 Windows 上使用最新版本。
      • @Jordan:2.2 已经发布,但据我所知,没有人为 Windows 开发过它。您可以尝试在 rpy-talk 邮件列表上询问,但我想它仍在等待有需要和有时间的人。
      猜你喜欢
      • 2015-07-04
      • 2012-11-17
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 2011-03-31
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多