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

本笨妞自从用了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 python

from distutils.core import setup,Extension,os
import string

setup(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下

./configure
make
make install
cd python
python setup.py build
python setup.py install
ln -s /usr/local/lib/libcrfpp.so* /usr/lib

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值