我是Python的新手(以及一般的编程)我来自金融背景,所以请耐心等待。我刚开始使用Python(Enthought的Pylab / Scipy / Numpy)和R进行统计分析。我正在尝试将rpy2安装到Python中以集成R,但我收到错误:
试图猜测R的HOME而不是R PATH中的命令。
我不确定这意味着什么。我的R.exe的路径是“C:\ Program Files \ R \ R-2.12.1 \ bin”,如果它有用的话。任何帮助将不胜感激!
这是setup.py的代码
import os, os.path, sys, shutil, re, itertools
from distutils.command.build_ext import build_ext as _build_ext
from distutils.command.build import build as _build
from distutils.core import setup
from distutils.core import Extension
pack_name = 'rpy2'
pack_version = __import__('rpy').__version__
class build(_build):
user_options = _build.user_options + \
[
#('r-autoconfig', None,
# "guess all configuration paths from " +\
# "the R executable found in the PATH " +\
# "(this overrides r-home)"),
('r-home=', None,
"full path for the R home to compile against " +\
"(see r-autoconfig for an automatic configuration)"),
('r-home-lib=', None,
"full path for the R shared lib/ directory " +\
"(<r-home>/lib otherwise)"),
('r-home-modules=', None,
"full path for the R shared modules/ directory " +\
"(<r-home>/modules otherwise)")
]
boolean_options = _build.boolean_options #+ \
#['r-autoconfig', ]
def initialize_options(self):
_build.initialize_options(self)
self.r_autoconfig = None
self.r_home = None
self.r_home_lib = None
self.r_home_modules = None
class build_ext(_build_ext):
"""
-DRPY_VERBOSE
-DRPY_DEBUG_PRESERV
-DRPY_DEBUG_PROMISE : evaluation of promises
-DRPY_DEBUG_OBJECTINIT : initialization of PySexpObject
-DRPY_DEBUG_CONSOLE : console I/O
-DRPY_DEBUG_COBJECT : SexpObject passed as a CObject
-DRPY_DEBUG_GRDEV
"""
user_options = _build_ext.user_options + \
[
#('r-autoconfig', None,
# "guess all configuration paths from " +\
# "the R executable found in the PATH " +\
# "(this overrides r-home)"),
('r-home=', None,
"full path for the R home to compile against " +\
"(see r-autoconfig for an automatic configuration)"),
('r-home-lib=', None,
"full path for the R shared lib/ directory" +\
"(<r-home>/lib otherwise)"),
('r-home-modules=', None,
"full path for the R shared modules/ directory" +\
"(<r-home>/modules otherwise)")]
boolean_options = _build_ext.boolean_options #+ \
#['r-autoconfig', ]
def initialize_options(self):
_build_ext.initialize_options(self)
self.r_autoconfig = None
self.r_home = None
self.r_home_lib = None
self.r_home_modules = None
def finalize_options(self):
self.set_undefined_options('build',
#('r_autoconfig', 'r_autoconfig'),
('r_home', 'r_home'))
_build_ext.finalize_options(self)
if self.r_home is None:
self.r_home = os.popen("R RHOME").readlines()
if len(self.r_home) == 0:
raise SystemExit("Error: Tried to guess R's HOME but no R command in the PATH.")
#Twist if 'R RHOME' spits out a warning
if self.r_home[0].startswith("WARNING"):
self.r_home = self.r_home[1]
else:
self.r_home = self.r_home[0]
#self.r_home = [self.r_home, ]
if self.r_home is None:
raise SystemExit("Error: --r-home not specified.")
else:
self.r_home = self.r_home.split(os.pathsep)
rversions = []
for r_home in self.r_home:
r_home = r_home.strip()
rversion = get_rversion(r_home)
if cmp_version(rversion[:2], [2, 8]) == -1:
raise SystemExit("Error: R >= 2.8 required.")
rversions.append(rversion)
config = RConfig()
for about in ('--ldflags', '--cppflags',
'LAPACK_LIBS', 'BLAS_LIBS'):
config += get_rconfig(r_home, about)
print(config.__repr__())
self.include_dirs.extend(config._include_dirs)
self.libraries.extend(config._libraries)
self.library_dirs.extend(config._library_dirs)
if self.r_home_modules is None:
self.library_dirs.extend([os.path.join(r_home, 'modules'), ])
else:
self.library_dirs.extends([self.r_home_modules, ])
#for e in self.extensions:
# self.extra_link_args.extra_link_args(config.extra_link_args)
# e.extra_compile_args.extend(extra_compile_args)
def run(self):
_build_ext.run(self)
def get_rversion(r_home):
r_exec = os.path.join(r_home, 'bin', 'R')
# Twist if Win32
if sys.platform == "win32":
rp = os.popen3('"'+r_exec+'" --version')[2]
else:
rp = os.popen('"'+r_exec+'" --version')
rversion = rp.readline()
#Twist if 'R RHOME' spits out a warning
if rversion.startswith("WARNING"):
rversion = rp.readline()
m = re.match('^R version ([^ ]+) .+$', rversion)
rversion = m.groups()[0]
rversion = rversion.split('.')
rversion[0] = int(rversion[0])
rversion[1] = int(rversion[1])
return rversion
def cmp_version(x, y):
if (x[0] < y[0]):
return -1
if (x[0] > y[0]):
return 1
if (x[0] == y[0]):
if len(x) == 1 or len(y) == 1:
return 0
return cmp_version(x[1:], y[1:])
class RConfig(object):
_include_dirs = None
_libraries = None
_library_dirs = None
_extra_link_args = None
_frameworks = None
_framework_dirs = None
def __init__(self,
include_dirs = tuple(), libraries = tuple(),
library_dirs = tuple(), extra_link_args = tuple(),
frameworks = tuple(),
framework_dirs = tuple()):
for k in ('include_dirs', 'libraries',
'library_dirs', 'extra_link_args'):
v = locals()[k]
if not isinstance(v, tuple):
if isinstance(v, str):
v = [v, ]
v = tuple(set(v))
self.__dict__['_'+k] = v
# frameworks are specific to OSX
for k in ('framework_dirs', 'frameworks'):
v = locals()[k]
if not isinstance(v, tuple):
if isinstance(v, str):
v = [v, ]
v = tuple(set(v))
self.__dict__['_'+k] = v
self.__dict__['_'+'extra_link_args'] = tuple(set(v + self.__dict__['_'+'extra_link_args']))
def __repr__(self):
s = 'Configuration for R as a library:' + os.linesep
s += os.linesep.join(
[' ' + x + ': ' + self.__dict__['_'+x].__repr__() \
for x in ('include_dirs', 'libraries',
'library_dirs', 'extra_link_args')])
s += os.linesep + ' # OSX-specific (included in extra_link_args)' + os.linesep
s += os.linesep.join(
[' ' + x + ': ' + self.__dict__['_'+x].__repr__() \
for x in ('framework_dirs', 'frameworks')]
)
return s
def __add__(self, config):
assert isinstance(config, RConfig)
res = RConfig(include_dirs = self._include_dirs + \
config._include_dirs,
libraries = self._libraries + config._libraries,
library_dirs = self._library_dirs + \
config._library_dirs,
extra_link_args = self._extra_link_args + \
config._extra_link_args)
return res
@staticmethod
def from_string(string, allow_empty = False):
possible_patterns = ('^-L(?P<library_dirs>[^ ]+)$',
'^-l(?P<libraries>[^ ]+)$',
'^-I(?P<include_dirs>[^ ]+)$',
'^(?P<framework_dirs>-F[^ ]+?)$',
'^(?P<frameworks>-framework [^ ]+)$')
pp = [re.compile(x) for x in possible_patterns]
# sanity check of what is returned into rconfig
rconfig_m = None
span = (0, 0)
rc = RConfig()
for substring in re.split('(?<!-framework) ', string):
ok = False
for pattern in pp:
rconfig_m = pattern.match(substring)
if rconfig_m is not None:
rc += RConfig(**rconfig_m.groupdict())
span = rconfig_m.span()
ok = True
break
elif rconfig_m is None:
if allow_empty and (rconfig == ''):
print(cmd + '\nreturned an empty string.\n')
rc += RConfig()
ok = True
break
else:
# if the configuration points to an existing library,
# use it
if os.path.exists(string):
rc += RConfig(library = substring)
ok = True
break
if not ok:
raise ValueError('Invalid substring\n' + substring
+ '\nin string\n' + string)
return rc
def get_rconfig(r_home, about, allow_empty = False):
r_exec = os.path.join(r_home, 'bin', 'R')
cmd = '"'+r_exec+'" CMD config '+about
rp = os.popen(cmd)
rconfig = rp.readline()
#Twist if 'R RHOME' spits out a warning
if rconfig.startswith("WARNING"):
rconfig = rp.readline()
rconfig = rconfig.strip()
rc = RConfig.from_string(rconfig)
return rc
def getRinterface_ext():
#r_libs = [os.path.join(RHOME, 'lib'), os.path.join(RHOME, 'modules')]
r_libs = []
extra_link_args = []
#FIXME: crude way (will break in many cases)
#check how to get how to have a configure step
define_macros = []
if sys.platform == 'win32':
define_macros.append(('Win32', 1))
else:
define_macros.append(('R_INTERFACE_PTRS', 1))
define_macros.append(('HAVE_POSIX_SIGJMP', 1))
define_macros.append(('CSTACK_DEFNS', 1))
define_macros.append(('RIF_HAS_RSIGHAND', 1))
include_dirs = []
rinterface_ext = Extension(
name = pack_name + '.rinterface.rinterface',
sources = [ \
#os.path.join('rpy', 'rinterface', 'embeddedr.c'),
#os.path.join('rpy', 'rinterface', 'r_utils.c'),
#os.path.join('rpy', 'rinterface', 'buffer.c'),
#os.path.join('rpy', 'rinterface', 'sequence.c'),
#os.path.join('rpy', 'rinterface', 'sexp.c'),
os.path.join('rpy', 'rinterface', 'rinterface.c')
],
depends = [os.path.join('rpy', 'rinterface', 'embeddedr.h'),
os.path.join('rpy', 'rinterface', 'r_utils.h'),
os.path.join('rpy', 'rinterface', 'buffer.h'),
os.path.join('rpy', 'rinterface', 'sequence.h'),
os.path.join('rpy', 'rinterface', 'sexp.h'),
os.path.join('rpy', 'rinterface', 'rpy_rinterface.h')
],
include_dirs = [os.path.join('rpy', 'rinterface'),] + include_dirs,
libraries = ['R', ],
library_dirs = r_libs,
define_macros = define_macros,
runtime_library_dirs = r_libs,
#extra_compile_args=['-O0', '-g'],
#extra_link_args = extra_link_args
)
rpy_device_ext = Extension(
pack_name + '.rinterface.rpy_device',
[
os.path.join('rpy', 'rinterface', 'rpy_device.c'),
],
include_dirs = include_dirs +
[os.path.join('rpy', 'rinterface'), ],
libraries = ['R', ],
library_dirs = r_libs,
define_macros = define_macros,
runtime_library_dirs = r_libs,
#extra_compile_args=['-O0', '-g'],
extra_link_args = extra_link_args
)
return [rinterface_ext, rpy_device_ext]
rinterface_exts = []
ri_ext = getRinterface_ext()
rinterface_exts.append(ri_ext)
pack_dir = {pack_name: 'rpy'}
import distutils.command.install
for scheme in distutils.command.install.INSTALL_SCHEMES.values():
scheme['data'] = scheme['purelib']
setup(
#install_requires=['distribute'],
cmdclass = {'build': build,
'build_ext': build_ext},
name = pack_name,
version = pack_version,
description = "Python interface to the R language",
url = "http://rpy.sourceforge.net",
license = "AGPLv3.0 (except rpy2.rinterface: LGPL)",
author = "Laurent Gautier",
author_email = "lgautier@gmail.com",
ext_modules = rinterface_exts[0],
package_dir = pack_dir,
packages = [pack_name,
pack_name + '.rlike',
pack_name + '.rlike.tests',
pack_name + '.rinterface',
pack_name + '.rinterface.tests',
pack_name + '.robjects',
pack_name + '.robjects.tests',
pack_name + '.robjects.lib',
],
classifiers = ['Programming Language :: Python',
'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)',
'License :: OSI Approved :: GNU Affero General Public License v3',
'Intended Audience :: Developers',
'Intended Audience :: Science/Research',
'Development Status :: 5 - Production/Stable'
],
data_files = [(os.path.join('rpy2', 'images'),
[os.path.join('doc', 'source', 'rpy2_logo.png')])]
#[pack_name + '.rinterface_' + x for x in rinterface_rversions] + \
#[pack_name + '.rinterface_' + x + '.tests' for x in rinterface_rversions]
)
答案 0 :(得分:8)
我知道我参加派对的时间有点晚了,但我遇到了同样的问题,并通过conda进行安装,让它在Windows 7上运行
conda install --channel https://conda.binstar.org/joshadel rpy2
答案 1 :(得分:2)
我在尝试将Rpy2与R 2.12和Python 2.6一起使用时遇到了类似的问题(根据rpy2文档的建议)。
来自http://cran.r-project.org/bin/windows/base/R-2.12.1-win.exe的Windows二进制文件似乎在rpy2不期望的目录中安装所需的R.dll。
我已将R \ R-2.12.1 \ bin \ i386中的所有文件复制到bin目录,设置一个指向R \ R-2.12.1的环境变量R_HOME然后工作。
答案 2 :(得分:2)
我遇到了一些不同但相关的安装问题,最后在http://www.mail-archive.com/rpy-list@lists.sourceforge.net/msg02817.html
找到了解决方案通过rpy2-2.0.8.win32-py2.6.msi(windows 7(64位),python 2.6,R 2.14(32位和64位,通过RAndFriendsSetup2140V3.2-1-1)安装rpy2 2.0.8之后.exe)),并试图在python控制台中导入rpy2,我得到了例外:
无法找到R.dll
将以下行添加到rinterface / __ init__.py使其工作:
if os.path.exists(os.path.join(R_HOME, 'lib')): ## ADDED ##
os.environ['PATH'] += ';' + os.path.join(R_HOME, 'bin')
os.environ['PATH'] += ';' + os.path.join(R_HOME, 'modules')
os.environ['PATH'] += ';' + os.path.join(R_HOME, 'lib')
else: ## ADDED ##
os.environ['PATH'] += ';' + os.path.join(R_HOME, 'bin', 'i386') ## ADDED ##
os.environ['PATH'] += ';' + os.path.join(R_HOME, 'modules', 'i386') ## ADDED ##
os.environ['PATH'] += ';' + os.path.join(R_HOME, 'library') ## ADDED ##
# Load the R dll using the explicit path
# First try the bin dir:
Rlib = os.path.join(R_HOME, 'bin', 'R.dll')
# Try bin/i386 subdirectory seen in R 2.12.0 ## ADDED ##
if not os.path.exists(Rlib): ## ADDED ##
Rlib = os.path.join(R_HOME, 'bin', 'i386', 'R.dll') ## ADDED ##
# Then the lib dir:
if not os.path.exists(Rlib):
Rlib = os.path.join(R_HOME, 'lib', 'R.dll')
# Otherwise fail out!
if not os.path.exists(Rlib):
raise RuntimeError("Unable to locate R.dll within %s" % R_HOME)
事实证明,R.dll已被移动,但__init__.py未相应更新。因此,只需编辑__init__.py文件就可以解决问题。
然后我试图复制Taj G的情况,我做到了。 将“your_R_installation_dir \ bin \ i386”添加到Windows环境变量PATH后,旧错误消失但新的错误消失了:
ValueError:字符串
中的无效子字符串似乎需要安装一些额外的部分,并且需要正确配置C / C ++编译器。我放弃了。使用easy_install从源代码构建rpy2在Windows上看起来非常棘手,而且目前还没有正式支持。
虽然与2.2.4相比,rpy2 2.0.8不是一个完整的版本,但它是sourceforge上带有标准Windows安装程序的最新版本。目前,这是一个简单的选择。
答案 3 :(得分:1)
我也遇到了RPy2的问题,经过几天和几天尝试所有不同类型的解决方案后,我从未真正开始工作。我鼓励你尝试一下人们告诉你的所有好点子,我很想看看他们是否有效!
如果您像我一样失败,您可以根据您的目的以下列方式使用解决方法:
使用您想要使用的所有函数编写R代码,这些函数也会调用您要使用的库。将所有这些函数和库调用放入一个文件(temp.r)。例如,也许我的文件看起来像是
CurrentYear <- function(birth.year,age) {
year <- birth.year + age
return(year)
}
使用python提示用户输入进行函数调用。我用GUI做了这个,你可以用终端中的脚本来做。
使用python创建一个带有R函数调用的字符串。例如,我们可能有
stuff = '\nCurrentYear("%(birth.year)d", "%(age)d")\n' %vars()
用户在python程序中输入birth.year
和age
的位置。
使用python将stuff
添加到temp.r
的末尾:
# Creates a copy of temp.r, so as not to disturb its contents for future use.
tocall = copyfile("C:\My Documents\temp.r", "C:\My Documents\tocall.r")
# Open the copy with the intent to append it (hence the "a")
inp = open("C:\tocall.r", "a")
# Adds the function call to the R script
inp.write(stuff)
inp.close()
# Navigate to the correct directory, use "Rscript" to
# run the code in the shell
dostuff = call('cd C:\My Documents &Rscript temp.r', shell = True)
我不确定这种方法的缺点是什么,但它对我有用。希望如果你失败了整个RPy2,这会有所帮助!
答案 4 :(得分:0)
我在win32“WINBLOW:”XP中运行rpy2时遇到了同样的问题;但是我得到了这个,最后!!
我是这样做的:
与Guillaume相同,我不得不将所有文件从C:\ Program Files \ R \ R-2.15.0 \ bin \ i386复制到R \ R-2.15.0
我必须设置一个环境变量
转到我的电脑&gt;属性&gt;高级&gt;环境变量&gt; 变量:“PATH”,在“值”
的末尾添加;C:\Program Files\R\R-2.15.0
python setup.py build install
C:\Python27\rpy2>
醇>
希望这个帮助,请告诉我这是否适合您。
答案 5 :(得分:0)
从源代码中获得最终使用Windows 7的rpy2。如果它不适合你,就像它对我来说没有。请参阅rpy2 install on windows 7。
希望这会有所帮助!!