windows10和linux配置CRF++的python接口

来源:互联网 发布:淘宝客服工资怎么样 编辑:程序博客网 时间:2024/06/05 14:54

本笨妞自从用了python之后,就堕落了,能python的基本不java,能java的基本不c。然而CRF++是C版本的,尽管用的时候直接命令行就可以搞定,但还是想弄个python的接口,用起来方便。
我以为CRF++和libsvm一样直接复制进工程就可以加载了,其实不然。libsvm应该是已经做过python到cpp之间的build和install了,而CRF++虽然给出了python包,但是貌似要自己build和install.

好吧,自己动手,丰衣足食。

在Window下

1.首先将Makefile.msvc.in的后缀去掉,生成Makefile。
2.打开VS2013的命令行工具,进入CRF++-0.58的目录下,执行

nmake

执行中报错:
这里写图片描述
根据报错,将tagger.cpp的758行先屏蔽掉,重新编译通过。(这一行调用prob()函数没有给参数,报错了,而前面有一行prob(i,j)没有报错,可能是这个问题,后续看程序的时候理一理这个问题,先安装再说。)

3.首先确认自己是否已经安装了VCForPython,这好像是通过python编译C文件的工具,如果已经安装了,跳过此步。
我用的python2.72,所以安装的是VCForPython27。在官网上下载该工具。
安装完后,我自己编译的时候还是不能找到vcvarsall.bat,按照某位大神的指点,找到VCForPython的安装目录,我的为
C:\Users\your_user_name\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0
下面就有vcvarsall.bat。
打开python安装目录下的Lib\distutils\msvc9compiler.py,在函数find_vcvarsall下,直接返回上面的目录

def find_vcvarsall(version):    """Find the vcvarsall.bat file    At first it tries to find the productdir of VS 2008 in the registry. If    that fails it falls back to the VS90COMNTOOLS env var.    """    return r'C:\Users\your_user_name\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat'    vsbase = VS_BASE % version    try:        productdir = Reg.get_value(r"%s\Setup\VC" % vsbase,                                   "productdir")    except KeyError:        productdir = None    # trying Express edition    if productdir is None:        vsbase = VSEXPRESS_BASE % version        try:            productdir = Reg.get_value(r"%s\Setup\VC" % vsbase,                                       "productdir")        except KeyError:            productdir = None            log.debug("Unable to find productdir in registry")    if not productdir or not os.path.isdir(productdir):        toolskey = "VS%0.f0COMNTOOLS" % version        toolsdir = os.environ.get(toolskey, None)        if toolsdir and os.path.isdir(toolsdir):            productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC")            productdir = os.path.abspath(productdir)            if not os.path.isdir(productdir):                log.debug("%s is not a valid directory" % productdir)                return None        else:            log.debug("Env var %s is not set or invalid" % toolskey)    if not productdir:        log.debug("No productdir found")        return None    vcvarsall = os.path.join(productdir, "vcvarsall.bat")    if os.path.isfile(vcvarsall):        return vcvarsall    log.debug("Unable to find vcvarsall.bat")    return None

然后编译就能找到了。

4.python的setup和extension
在CRF++-0.58里的python包下面有供build和install的setup.py, 程序如下:

#!/usr/bin/env pythonfrom distutils.core import setup,Extension,osimport stringsetup(name = "mecab-python",      py_modules=["CRFPP"],      ext_modules = [Extension("_CRFPP",                               ["CRFPP_wrap.cxx",],                               libraries=["crfpp", "pthread"])                     ])

setup里面包含了一个扩展模块,扩展了C程序CRFPP_wrap.cxx,这个程序需要调用库文件crfpp.lib和pthread.lib。同时,还需要头文件crfpp.h。但是这些文件python文件夹下是没有的,crfpp.h可以直接拷贝根目录下的,但两个库文件没有。一开始看别人的博客,拷贝了别人生成的crfpp.lib和pthread.lib,执行

python setup.py build

报如下错误:
这里写图片描述

5.仔细研究后,觉得在make时生成的libcrfpp.lib应该是包含了所有库的,于是把自己生成的libcrfpp.lib拷贝进python,再次build,居然成功了。

6.执行

python setup.py install

7.在命令行打开python,并

import CRFPP

没有报错,安装成功。

在ubuntu下

./configuremakemake installcd pythonpython setup.py buildpython setup.py installln -s /usr/local/lib/libcrfpp.so* /usr/lib

编译源程序到配置python接口全部搞定。
测试ok.

在windows下配置还是花了较长时间的。编译、库文件都比较麻烦,中途差点就放弃了。不过这个过程使本笨妞了解到了python的setup、extension模块。

原创粉丝点击