在Windows XP上使用Python 2.6尝试让Rpy2 2.1.9与R 2.12.1兼容时,Rpy找不到R.dll?
我在让Rpy2和我的R安装配合使用时遇到了很大的问题。我最开始尝试安装rpy2的MSI包,但似乎没有成功。当我运行推荐的测试时,它给了我一个错误,提示找不到R.dll,因为新的R安装(2.11版本之后)把DLL文件放在了i386文件夹里,而rpy2在找的时候却在bin文件夹里找,结果找不到。
然后我尝试自己从头开始用命令行工具(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”这个位置,我确认它确实在那儿,并且我已经在Windows的默认PATH中指向了这个目录!我知道rpy2在找正确的地方,但就是搞不懂为什么它看不到R.dll。
那么,为什么rpy2找不到它呢?有没有人知道怎么让rpy2和R 2.12一起工作?也许我应该尝试更新的rpy2 2.2.0版本?不过它还在开发中,而1.9版本据说可以处理R 2.12,根据这个网站的说法,我不知道该怎么办...
感谢任何能提供帮助的人...
[编辑] 我还尝试了这里的说明,但它们返回的还是同样的“找不到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 个回答
我不太确定该把这个写在哪里,因为我不能评论(没有声望点数),但我觉得这些信息对解决这个问题很有帮助。造成让人烦恼的“无法找到 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 级别的上面来解决了这个问题。
RPy2这个软件在Windows系统上没有经过测试。你可以尝试使用一个旧版本(2.0.8),这个版本有Windows安装程序,但可能会和更新的R版本出现问题。
这个软件的作者不使用Windows。如果你有能力让更新的版本在Windows上运行,我相信他会很欢迎你的贡献。
经过在网上搜索了很多小时,尝试了各种方法,遇到了和上面一样的问题,我终于在我的Windows 7电脑上成功安装了Rpy2!
其实,最关键的帮助来自于这个讨论串:http://www.mail-archive.com/rpy-list@lists.sourceforge.net/msg03348.html。
简单来说,以下是我在Windows 7上安装rpy2的步骤:
- 从这个链接安装rpy2:https://bitbucket.org/breisfeld/rpy2_w32_fix/issue/1/binary-installer-for-win32
- 把R.dll的路径添加到环境变量PATH中(在我的情况下是C:\Program Files\R\R-2.12.1\bin\i386)
- 添加一个环境变量R_HOME(在我的情况下是C:\Program Files\R\R-2.12.1)
- 添加一个环境变量R_USER(就是我在Windows上的用户名)
- 重启你的Python开发环境(否则环境变量不会重新加载!)