由于自己缺省编译Python扩展的编译器是Visual C++,如果使用pip直接安装,rpy2模块的代码原本就不考虑微软C编译器,连inline关键字部分都过不去。因此选用MinGW进行编译,方法是在Python安装目录的Lib\distutils下创建distutils.cfg文件,写入如下内容:
[build]
compiler=mingw32
可能是针对Windows环境测试不充分,要想通过编译需要修改源代码,首先从PyPi下载源码包,地址为https://pypi.python.org/packages/source/r/rpy2/rpy2-2.6.0.tar.gz#md5=679898fbc832d4f05a5efcf1a7eb1a68
解开源码包,在rpy2-2.6.0\rpy\rinterface目录中修改_rinterface.c文件,找到第1321行,注释掉这句源代码
/*Rp->ResetConsole = EmbeddedR_ResetConsole; */
因为在当前版本R的头文件中压根没有这个成员定义,有趣的是顺便发现了开源开发人员调皮可爱的注释,分享一下
Rp->Busy = Re_Busy;
Rp->ShowMessage = EmbeddedR_ShowMessage;
/* Rp->FlushConsole = EmbeddedR_FlushConsole; */
/*Rp->ResetConsole = EmbeddedR_ResetConsole; */
Rp->CallBack = win32CallBack;
Rp->R_Quiet = FALSE;
Rp->R_Interactive = TRUE;
Rp->RestoreAction = SA_RESTORE;
Rp->SaveAction = SA_SAVEASK;
/* hocus-pocus for R-win32 - just don't ask why*/
R_SetParams(Rp);
R_SizeFromEnv(Rp);
R_SetParams(Rp);
setup_term_ui();
之后需要修改源码包根目录下setup.py的内容,找到第179行,增加库目录定义,如果不加这个库目录gcc找不到python27.dll的位置,就会出现未解决的外部引用符号错误,扯远了,不管你加在哪里,只要把库目录加进去就可以了,我用的是Anaconda,所以加出来如下所示
if sys.platform == 'win32':
define_macros.append(('Win32', 1))
if "64 bit" in sys.version:
define_macros.append(('Win64', 1))
extra_link_args.append('-m64')
extra_compile_args.append('-m64')
# MS_WIN64 only defined by pyconfig.h for MSVC.
# See http://bugs.python.org/issue4709
define_macros.append(('MS_WIN64', 1))
library_dirs.append('d:/Anaconda')
else:
最后修改Python按照目录下Lib\distutils中的unixccompiler.py代码,找到227行,注释掉原本从环境变量定位编译器的代码,直接指定编译器为gcc
#compiler = os.path.basename(sysconfig.get_config_var("CC"))
#
compiler = 'gcc'
#
之后就只可执行如下命令进行安装了
python setup.py build
python setup.py install
也预祝大家玩得愉快,:)