ROUGE与PyROUGE的安装:非root权限的尝试与失败

1 ROUGE的安装过程

主要参考了这篇博客:Ubuntu安装配置ROUGE

1.1 普通用户的权限问题

网上给出的教程大都是使用Root权限安装的,无论是yum install还是apt-get都是无法在普通用户权限下使用的。下面先给大家讲述我在普通用户权限下为安装ROUGE做的一些失败的尝试,请大家切勿模仿,我也不会给出十分详细的过程。成功的教程请看下一节。

首先,安装ROUGE需要用到Perl解释器,而Perl在Linux上是系统自带的。由于DOM要求Perl的版本在5.6.0以上所以我们需要用以下命令查看以下Perl的版本:

$ perl -v  # 我的结果是5.16.0,满足兼容性要求

那么如果使用这个版本的perl安装某个perl的包,接下来首先使用wget命令在官网上下载这个包,然后使用tar -zxvf命令解压,解压后进入到该目录下,使用perl安装三部曲:

$ perl MakeFile.PL
$ make
$ make install

如果你要安装的包下载下来解压后,文件夹中没有MakeFile.PL,那你需要使用./configure命令替换三部曲中的第一个命令,关于这三步都是什么作用,可以参考这篇博客:./configure,make,make install的作用。那么问题来了,一般情况下会出现以下问题:

Can't locate ExtUtils/MakeMaker.pm in @INC

那么我们理所当然的应该去安装MakeMaker,在官网下载它的包,然后解压,重新三部曲安装,然后,你会在make install的时候遇到问题,程序尝试在/usr目录下的perl路径中写文件,但普通用户没有写权限。实际上如果你在install之前就做过make test这时候也应该会报错的。那么网上就给出了解决方法,使用:

$ perl MakeFile.PL PREFIX=/home/username/some_location  # 或者
$ ./configure --prefix=/home/username/some_location

这样就将安装位置重定向到了用户目录下,自然就解决了权限问题。安装好MakeMaker后,在安装其他包的时候又会出现之前的Can't locate ExtUtils/MakeMaker.pm in @INC问题。这是因为我们虽然安装了MakeMaker,但root的perl仍然在默认的路径中寻找它。@INC是perl搜索安装工具的路径数组,默认路径都在root下,所以搜索不到。那么我们就需要修改@INC数组,网上又给出了N种方法。如果你感兴趣,这是比较全的一篇:6种方法配置perl的@INC变量

然而,在普通用户权限下实际上是没有一种永久修改@INC的方法的,另外修改环境变量的方法是扯淡的。然后我想到一个办法,在查看@INC变量值后,发现数组中有个.,这意味着它会搜索当前路径,所以我就把之前安装位置的ExtUtils文件夹直接拷贝了过来,果然又解决了几个包的安装,但总这样做也不是办法,最后又出现了一个无法解决的问题,大概是在make install的时候出现了can’t locate的问题,这个问题原来都是在perl MakeFile.PL那一步出现的,然而修改了@INC后,仍旧出现了这个问题,那就没有办法了,后来歪打正着遇到一个劝我重装perl-devel的。

思考了一阵人生之后,对啊,我为什么不重新安装一个perl啊,如果将perl安装在用户路径下不就问题都解决了吗?

1.2 在普通用户路径安装Perl

进入官网的下载界面:Download And Install Perl: ActivePerl 选择最新的5.26.3.2603版本Linux
(x86_64)的安装包,右键那个超链接,复制链接地址,这时你会得到:

https://www.activestate.com/products/activeperl/downloads/thank-you/?dl=https://downloads.activestate.com/ActivePerl/releases/5.26.3.2603/ActivePerl-5.26.3.2603-x86_64-linux-glibc-2.15-a701e55e0.tar.gz

如果直接wget这个网址的话,下载下来的压缩包会是损坏的,将会提示:gzip: stdin: not in gzip format。参考这篇博客:tar解压包的时候出现错误 gzip: stdin: not in gzip format,尝试一番后发现是压缩包下载过程中损坏。其实只需要将上面那个地址的第一个https地址删掉就好啦,这是一个经验:

$ wget https://downloads.activestate.com/ActivePerl/releases/5.26.3.2603/ActivePerl-5.26.3.2603-x86_64-linux-glibc-2.15-a701e55e0.tar.gz

解压后发现里面有个install.sh,想必是安装文件的bash脚本,于是:

$ bash install.sh

根据提示,同意了用户协议,设置了安装路径后就大工告成,但如果这时候使用perl -v查看版本,会发现当前的perl仍是root下built-in的perl。我们需要修改用户的环境变量来覆盖掉它。

vim ~/.bashrc

然后在.bashrc中加入如下:

# >>> perl init >>>
export PERL5LIB=/home/ursername/ActivePerl-5.26/bin  # 这是你安装perl时设置的安装路径
export PATH=$PERL5LIB:$PATH
# <<< perl init <<<

然后使用命令source ~/.bashrc或重新登录账户激活刚才的设置。到目前为止,前期铺垫就都做好啦,可以发现这个安装包中还自带了CPAN等诸多工具,不需要手动安装,省了很多事

1.3 安装ROUGE的八个步骤

好心的博主已经给出了安装包的大合集,之后我们的步骤中将会用到。

step1: 安装XML::Parser

首先将上述百度网盘中的XML-Parser-2.44.tar.gz下载到本地,使用Putty的pscp之类的命令拷贝到服务器端。提着一句是因为网盘的下载是需要账号登录的,需要cookie,所以直接用wget获取会很麻烦。
然后解压该安装包到当前路径:

$ tar -zxvf XML-Parser-2.44.tar.gz

进入解压得到的文件夹并开始安装

$ cd XML-Parser-2.44
$ perl Makefile.PL 
$ make 
$ make test
$ make install

在安装时我遇到了expat.h: No such file or directory的问题,我们需要再额外安装expat这个包,在这个网站可以找到:expat_2.0.1.orig.tar.gz。在安装好这个包后,安装XML-Parser的时候还需要带上expat的安装路径:

$ perl Makefile.PL EXPATLIBPATH=/home/username/some_location/expat/lib/ EXPATINCPATH=/home/username/some_location/expat/include/

step2: 安装XML::RegExp

以下几步参考step1的步骤安装

step3: 安装LWP::UserAgent

LWP::UserAgent是libwww-perl中的一部分,所以可以直接安装libwww,你可以在这个网站找到安装包:libwww-perl_6.35.orig.tar.gz

step4: 安装XML::Parser::PerlSAX

这个模块是libxml-perl中的一部分,所以我们直接安装libxml这个包,你可以在这个网站找到安装包:XML-LibXML-2.0134.tar.gz
按照step1中的步骤安装,在第一步的时候遇到以下问题:

libxml2, zlib, and/or the Math library (-lm) have not been found.
Try setting LIBS and INC values on the command line
Or get libxml2 from http://xmlsoft.org/
If you install via RPMs, make sure you also install the -devel
RPMs, as this is where the headers (.h files) are.

于是我们需要安装libxml2,我在这个镜像网站找到了安装包:libxml2-2.9.9.tar.gz。但是在安装的make步骤中又出现了这个错误:

libxml.c:14:20: fatal error: Python.h: No such file or directory

网上说这是缺少python-devel。于是我又递归地去安装python-devel。一共有两条路:yum install python-devel肯定是走不通了,于是我在rpm镜像网站找到了对应的rpm包:python-devel-2.7.5-76.el7.x86_64.rpm。这里你还需查看一下linux的系统版本,这里给出的包默认是CentOS7的:

$ cat /etc/redhat-release  # 结果是:CentOS Linux release 7.6.1810 (Core)

然后为了在普通用户权限下安装rpm包,你需要重定向安装路径:

$ rpm -i --prefix=/home/liushangyu/environment/python-devel python-devel-2.7.5-76.el7.x86_64.rpm

然后你就会得到错误信息:

error: package python-devel is not relocatable

是不是很有趣,这说明这个包是绝对不能再普通用户权限下安装的,打死都没办法。所以走到了死路,我们向上回溯,我尝试了下载更低版本的libxml2,调了各种安装路径和@INC之后貌似侥幸成功。但回到libxml的安装时,仍然毫不留情的报了原来的错,所以全是死路。经过一番思考人生,我决定用CPAN装这个包试一下,结果一试就成功了:

$ perl -MCPAN -e shell

进入CPAN的shell 中后,直接安装。成功后按q退出。

install XML::Parser::PerlSAX

step5: 安装XML::DOM

如果前面几个都没问题的话,到这里应该也能一遍过,继续参考step1的方法,资源在网盘里

step6: 安装DB_File

首先使用wget获取压缩包,你也可以从网盘中下载:

$ wget http://www.cpan.org/authors/id/P/PM/PMQS/DB_File-1.835.tar.gz

接下来和step1一样解压和安装,但你会在make那一步遇见如下问题:

DB_File.xs:155:20: fatal error: db.h: No such file or directory
 #    include <db.h>
                    ^
compilation terminated.
make: *** [DB_File.o] Error 1

这时候根据参考博客给出的方法,需要安装libdb-dev。由于我的系统是CentOS,所以需要安装libdb-devel(libdb-dev是Ubuntu版本的)。但是在网上能找到的只有rpm包。在安装rpm包的时候你会遇到和上面安装python-devel时一样的问题,就是,你必须有root权限。可能所有以devel为后缀的包的安装都需要root权限吧。
这时按照上面的套路我们来到了CPAN方法,直接安装DBFile,结果报了相同的错误。于是仔细研究了libdb是什么。libdb其实就是Berkeley DB,是oracle公司开发的一种数据库。于是网上的教程推荐到官网上下载,结果发现需要oracle的账号,注册账号又十分麻烦,外网的下载速度又很慢,所以另寻他法。
找啊找,我找到了这篇宝贝博客:berkeley db和db4的安装。我们按照这篇博客来安装Berkeley DB:

$ wget http://download.oracle.com/berkeley-db/db-4.6.21.tar.gz
$ tar -zxvf db-4.6.21.tar.gz
$ cd db-4.6.21
$ cd build_unix
$ ../dist/configure --prefix=/home/username/some_location/berkeleydb --enable-cxx

注意这里的configure一定是db-4.6.21/dist/下的,其中的prefix换成自己的安装路径,–enable-cxx表示编译C++库。接下来:

$ make
$ make install

如果你幸运的话,这里就安装成功了,按照标准教程的说法,为了激活DB库的路径,你还要执行如下操作:

$ echo '/usr/local/berkeleydb/lib/' >> /etc/ld.so.conf
$ ldconfig

很显然,这个操作是root权限的。网上的博客说,之所以它是root权限是出于安全性的考虑,如果数据库人人都可修改,岂不是很可怕。所以这里我们做不了。下面就是我表演的时候了。重新安装DBFile,观察上文出现的那个错误。不是找不到头文件吗,于是我们把它从安装位置直接拷贝过来就好了:

$ cp /home/username/some_location/berkeleydb/include/db.h .

这样仍然不行,因为代码中的#include <db.h>使用的是尖括号,会从系统指定的路径查找。于是我们每次运行,将报错文件的include都换成#include "db.h",大功告成。
另外一种可行的方案 回顾之前报错的具体信息,发现是在执行如下命令时出现的错误:

gcc -c  -I/usr/local/BerkeleyDB/include -D_REENTRANT -D_GNU_SOURCE -DUSE_SITECUSTOMIZE -DPERL_RELOCATABLE_INCPUSH -fno-merge-constants -fwrapv -fno-strict-aliasing -pipe -fstack-protector -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2   -DVERSION=\"1.843\" -DXS_VERSION=\"1.843\" -fPIC "-I/home/liushangyu/ActivePerl-5.26/lib/CORE"  -D_NOT_CORE  -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_int32_t   version.c

这说明在编译DB_File文件夹下的version.c时,引入了路径/usr/local/BerkeleyDB/include,显然这是不对的。那么我们只要把这个路径替换成正确的就可以了。这个命令是从哪里产生的呢?实际上,在perl Makeflie.PL后,文件夹下产生了文件Makefile。查看这个文件会发现里面有很多的参数配置,其中就包括了以上的路径。你可以通过这个命令查看它们都在哪:

$ cat Makefile | grep -n "BerkeleyDB"

在修改了Makefile文件中所有错误的路径后,重新make就通过了。

step7: 安装并设置ROUGE环境变量

下载ROUGE的时候发现,原博主给的网盘中唯独这个文件损坏了,总是下载一半的时候失败。那么我又找到另外一篇博客,其中给出了下载地址:GitHub。要单独下载工程中的这个目录,可以使用DownGit。下载后在.bashrc中设置环境变量:

export ROUGE_EVAL_HOME="$ROUGE_EVAL_HOME:/home/username/some_location/RELEASE-1.5.5/data"

step8: 测试安装是否成功

原博客中虽然没有提示,但我们想要测试,需要进入以上目录,新建一个名为sample-output文件夹。然后再新建一个自定义的文件夹,我这里叫test,并将runROUGE-test.pl拷贝到该文件下。还需要修改ROUGE-1.5.5.pl的执行权限,否则没法调用它。最后进入自定义的文件夹下,并运行测试。相关命令如下:

$ mkdir test
$ mkdir sample-output
$ cp runROUGE-test.pl test/
$ chmod +x ROUGE-1.5.5.pl
$ cd test
$ perl runROUGE-test.pl

然后先是报了DOM.pm中无法定位XML/Parser.pm的错误,明明安装了却找不到就很奇怪。使用如下命令查看安装位置:

$ perldoc -l XML::Parser

得到对应的路径后,将它用use lib的方式加入到DOM.pm中,这样这个错误就解决了。然后又开始报更奇怪的错误,是有关.so文件中有未定义符号的错误。网上说这是由于编译和执行使用的perl版本不同,然后我惊奇的发现在runROUGE-test.pl和ROUGE-1.5.5.pl中的第一句话:

\#! /usr/bin/perl -w

这句话实际上不完全是注释,它表明了编译这个程序使用的perl解释器的地址,于是我把这两个文件中的perl的路径改成了正确的路径。然后就报了如下的错误:

/home/liushangyu/ActivePerl-5.26/bin/perl: symbol lookup error: /home/liushangyu/ActivePerl-5.26/site/lib/auto/DB_File/DB_File.so: undefined symbol: db_version

我意识到,之前的小聪明并没有成功,我的Berkeley DB还是安装的有问题啊,看来必须使用root权限了。于是以上尝试以失败告终,没有ROUGE就更谈不上安装PyROUGE。坚持到底,请移步:从头再来:在虚拟机上搭建ROUGE和PyROUGE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值