simudaru's blog

Python, Rなどのメモを残していこうと思います。  よろしくお願いいたします。

PythonとMecabのバインディング

PythonMecabが使えるようにするのに手間取ったのでメモ

ちなみに、【最終的に入った】以前の内容は失敗履歴なので、

真似しないほうが良いです。

 

【環境】

Win7,  Python2.7.6(64bit版),  Mecab0.996

PythonMecabはインストール済み。

pathに以下を追加済み

C:\Python27;

C:\Python27\Scripts;

C:\Program Files (x86)\MeCab\bin;

 

 

mecab-pythonのセットアップ・・・失敗】

下記からmecab-python-0.996.tar.gz をダウンロードし、解凍する。

https://code.google.com/p/mecab/downloads/detail?name=mecab-python-0.996.tar.gz&can=2&q=

解凍は例えばcygwinで。

 

解凍したフォルダ内のsetup.pyを、自分の環境に合わせて書き換える。

※参考 http://d.hatena.ne.jp/factal/20120926

 

setup(name = "mecab-python",

    #version = cmd1("mecab-config --version"),

    version = "0.996",

    py_modules=["MeCab"],

    ext_modules = [

        Extension("_MeCab",

            ["MeCab_wrap.cxx",],

            include_dirs=[r"C:\Program Files (x86)\MeCab\sdk"],

            library_dirs=[r"C:\Program Files (x86)\MeCab\sdk"],

            libraries=["libmecab"])

            #include_dirs=cmd2("mecab-config --inc-dir"),

            #library_dirs=cmd2("mecab-config --libs-only-L"),

            #libraries=cmd2("mecab-config --libs-only-l"))

            ])

 

ここでsetup.pyを実行しても、

vcvarsall.batが見つからないというエラーになる。

python setup.py build

error: Unable to find vcvarsall.bat

 

 

【Visual C++ 2008 Express Editionのインストール】

vcvarsall.batを手に入れるためにはVisual C++ 2008 Express Edition を

インストールする必要があるらしいので、下記からインストール。

http://go.microsoft.com/?LinkId=9348304

 

Pathにも追加しておく。

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC;

 

これで動くかと思いきや、動かず。

python setup.py install

running build

running build_py

running build_ext

building '_MeCab' extension

Traceback (most recent call last):

  File "setup.py", line 21, in <module>

    libraries=["libmecab"])

  File "C:\Python27\lib\distutils\core.py", line 152, in setup

    dist.run_commands()

  File "C:\Python27\lib\distutils\dist.py", line 953, in run_commands

    self.run_command(cmd)

  File "C:\Python27\lib\distutils\dist.py", line 972, in run_command

    cmd_obj.run()

  File "C:\Python27\lib\distutils\command\build.py", line 127, in run

    self.run_command(cmd_name)

  File "C:\Python27\lib\distutils\cmd.py", line 326, in run_command

    self.distribution.run_command(command)

  File "C:\Python27\lib\distutils\dist.py", line 972, in run_command

    cmd_obj.run()

  File "C:\Python27\lib\distutils\command\build_ext.py", line 337, in run

    self.build_extensions()

  File "C:\Python27\lib\distutils\command\build_ext.py", line 446, in build_extensions

    self.build_extension(ext)

  File "C:\Python27\lib\distutils\command\build_ext.py", line 496, in build_extension

    depends=ext.depends)

  File "C:\Python27\lib\distutils\msvc9compiler.py", line 473, in compile

    self.initialize()

  File "C:\Python27\lib\distutils\msvc9compiler.py", line 383, in initialize

    vc_env = query_vcvarsall(VERSION, plat_spec)

  File "C:\Python27\lib\distutils\msvc9compiler.py", line 299, in query_vcvarsall

    raise ValueError(str(list(result.keys())))

ValueError: [u'path']

 

 

【msvc9compiler.pyの変更・・・不要だった】

※この節は不要だったため、読み飛ばして頂いて結構です。

なんか下記が関係してそう。

http://bugs.python.org/issue7511

※参考 http://blog.loadlimits.info/2012/03/installing-hg-git-for-windows7-x64/

 

 

手動で、vcvars4.diffの変更をmsvc9compiler.pyに対して実施。

もう一度実行。・・・まだだめ。

python setup.py build

running build

running build_py

running build_ext

building '_MeCab' extension

error: Visual Studio Express: need 64-bit tools from the SDK

 

うーん・・・。駄目そう。

変更は元に戻した。

 

 

【vcvarsamd64.batの作成】

関係あるのはこっちかな。

http://stackoverflow.com/questions/3827170/why-do-i-get-an-error-on-the-last-line-of-installing-pylons-1-0-with-easy-instal

 

以下フォルダを作成

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat

 

vcvarsamd64.batの中身は下記

call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64 /Release

 

自分も質問者同様、Windows SDK7.1が入ってない・・・。

 

 

Windows SDK 7.1のダウンロード】

Windows SDK 7.1をダウンロード、インストール

http://www.microsoft.com/en-us/download/confirmation.aspx?id=8279

 

この時もエラー。

以下がインストールされているとダメらしいので、アンインストール

Microsoft Visual C++ 2010 x86 Redistributable

Microsoft Visual C++ 2010 x64 Redistributable

※参考 http://www.projectgroup.info/tips/Others/comm_0004.html

 

再度インストール。今度はWindows SDK 7.1はうまく入った。

 

 

mecab-pythonのセットアップ・・・失敗】

これで解決・・・してない。

python setup.py install

running build

running build_py

running build_ext

building '_MeCab' extension

creating build\temp.win-amd64-2.7

creating build\temp.win-amd64-2.7\Release

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\cl.exe /c /nolo

go /Ox /MD /W3 /GS- /DNDEBUG "-IC:\Program Files (x86)\MeCab\sdk" -IC:\Python27\

include -IC:\Python27\PC /TpMeCab_wrap.cxx /Fobuild\temp.win-amd64-2.7\Release\M

eCab_wrap.obj

MeCab_wrap.cxx

MeCab_wrap.cxx(3747) : warning C4530: C++ exception handler used, but unwind sem

antics are not enabled. Specify /EHsc

MeCab_wrap.cxx(5583) : error C2039: 'set_result' : is not a member of 'MeCab::La

ttice'

        C:\Program Files (x86)\MeCab\sdk\mecab.h(778) : see declaration of 'MeCa

b::Lattice'

error: command '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Bin\amd6

4\cl.exe"' failed with exit status 2

 

 

mecab.h に追記】

C:\Program Files (x86)\MeCab\sdk\mecab.hの中の、Latticeクラスを変更すればよいらしい

※参考 http://seesaawiki.jp/spz/d/Windows%a4%cbmecab-python%a4%f2%c6%b3%c6%fe

 

/**

 * Lattice class

 */

class MECAB_DLL_CLASS_EXTERN Lattice {

public:

 

  virtual void set_result(const char *str)        = 0; //この1行を追加

 

  /**

   * Clear all internal lattice data.

   */

  virtual void clear()              = 0;

 

 

 

mecab-pythonのセットアップ・・・失敗】

まだなんかあるのかよ・・・。

python setup.py install

running build

running build_py

running build_ext

building '_MeCab' extension

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG "-IC:\Program Files (x86)\MeCab\sdk" -IC:\Python27\include -IC:\Python27\PC /TpMeCab_wrap.cxx /Fobuild\temp.win-amd64-2.7\Release\MeCab_wrap.obj

MeCab_wrap.cxx

MeCab_wrap.cxx(3747) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\link.exe /DLL /nologo /INCREMENTAL:NO "/LIBPATH:C:\Program Files (x86)\MeCab\sdk" /LIBPATH:C:\Python27\libs /LIBPATH:C:\Python27\PCbuild\amd64 libmecab.lib /EXPORT:init_MeCab

build\temp.win-amd64-2.7\Release\MeCab_wrap.obj /OUT:build\lib.win-amd64-2.7\_MeCab.pyd /IMPLIB:build\temp.win-amd64-2.7\Release\_MeCab.lib /MANIFESTFILE:build\temp.win-amd64-2.7\Release\_MeCab.pyd.manifest

MeCab_wrap.obj : warning LNK4197: export 'init_MeCab' specified multiple times;

using first specification

   Creating library build\temp.win-amd64-2.7\Release\_MeCab.lib and object build\temp.win-amd64-2.7\Release\_MeCab.exp

MeCab_wrap.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) char const * __cdecl MeCab::getLastError(void)" (__imp_?getLastError@MeCab@@YAPEBDXZ) referenced in function "class MeCab::Tagger * __cdecl new_MeCab_Tagger(char const *)" (?new_MeCab_Tagger@@YAPEAVTagger@MeCab@@PEBD@Z)

MeCab_wrap.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class MeCab::Tagger * __cdecl MeCab::createTagger(char const *)" (__imp_?createTagger@MeCab@@YAPEAVTagger@1@PEBD@Z) referenced in function "class MeCab::Tagger * __cdecl new_MeCab_Tagger(char const *)" (?new_MeCab_Tagger@@YAPEAVTagger@MeCab@@PEBD@Z)

MeCab_wrap.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class MeCab::Model * __cdecl MeCab::createModel(char const *)" (__imp_?createModel@MeCab@@YAPEAVModel@1@PEBD@Z) referenced in function "class MeCab::Model * __cdecl new_MeCab_Model(char const *)" (?new_MeCab_Model@@YAPEAVModel@MeCab@@PEBD@Z)

MeCab_wrap.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class MeCab::Lattice * __cdecl MeCab::createLattice(void)" (__imp_?createLattice@MeCab@@YAPEAVLattice@1@XZ) referenced in function "class MeCab::Lattice * __cdecl new_MeCab_Lattice(void)" (?new_MeCab_Lattice@@YAPEAVLattice@MeCab@@XZ)

MeCab_wrap.obj : error LNK2019: unresolved external symbol "public: static charconst * __cdecl MeCab::Model::version(void)" (?version@Model@MeCab@@SAPEBDXZ) referenced in function _wrap_Model_version

MeCab_wrap.obj : error LNK2019: unresolved external symbol "public: static class MeCab::Model * __cdecl MeCab::Model::create(int,char * *)" (?create@Model@MeCab@@SAPEAV12@HPEAPEAD@Z) referenced in function _wrap_Model_create__SWIG_0

MeCab_wrap.obj : error LNK2019: unresolved external symbol "public: static class MeCab::Model * __cdecl MeCab::Model::create(char const *)" (?create@Model@MeCab@@SAPEAV12@PEBD@Z) referenced in function _wrap_Model_create__SWIG_1

MeCab_wrap.obj : error LNK2019: unresolved external symbol "public: static bool__cdecl MeCab::Tagger::parse(class MeCab::Model const &,class MeCab::Lattice *)" (?parse@Tagger@MeCab@@SA_NAEBVModel@2@PEAVLattice@2@@Z) referenced in function_wrap_Tagger_parse__SWIG_0

MeCab_wrap.obj : error LNK2019: unresolved external symbol "public: static class MeCab::Tagger * __cdecl MeCab::Tagger::create(int,char * *)" (?create@Tagger@MeCab@@SAPEAV12@HPEAPEAD@Z) referenced in function _wrap_Tagger_create__SWIG_0

MeCab_wrap.obj : error LNK2019: unresolved external symbol "public: static class MeCab::Tagger * __cdecl MeCab::Tagger::create(char const *)" (?create@Tagger@MeCab@@SAPEAV12@PEBD@Z) referenced in function _wrap_Tagger_create__SWIG_1

MeCab_wrap.obj : error LNK2019: unresolved external symbol "public: static charconst * __cdecl MeCab::Tagger::version(void)" (?version@Tagger@MeCab@@SAPEBDXZ)referenced in function _wrap_Tagger_version

build\lib.win-amd64-2.7\_MeCab.pyd : fatal error LNK1120: 11 unresolved externals

error: command '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\link.exe"' failed with exit status 1120

 

 

MeCab_wrap.cxxの変更・・・ダメ】

この記事が該当しそう。

※参考 http://www.freia.jp/taka/blog/759/

以下2行をコメントアウトした。

{ (char *)"Tagger_create", _wrap_Tagger_create, METH_VARARGS, NULL},

{ (char *)"Tagger_version", _wrap_Tagger_version, METH_VARARGS, NULL},

 

多少エラーは減ったが、通らない・・・。

 

running build

running build_py

running build_ext

building '_MeCab' extension

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG "-IC:\Program Files (x86)\MeCab\sdk" -IC:\Python27\

include -IC:\Python27\PC /TpMeCab_wrap.cxx /Fobuild\temp.win-amd64-2.7\Release\M

eCab_wrap.obj

MeCab_wrap.cxx

MeCab_wrap.cxx(3747) : warning C4530: C++ exception handler used, but unwind sem

antics are not enabled. Specify /EHsc

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\link.exe /DLL /nologo /INCREMENTAL:NO "/LIBPATH:C:\Program Files (x86)\MeCab\sdk" /LIBPATH:C:\Python27\libs /LIBPATH:C:\Python27\PCbuild\amd64 libmecab.lib /EXPORT:init_MeCab

build\temp.win-amd64-2.7\Release\MeCab_wrap.obj /OUT:build\lib.win-amd64-2.7\_MeCab.pyd /IMPLIB:build\temp.win-amd64-2.7\Release\_MeCab.lib /MANIFESTFILE:build\temp.win-amd64-2.7\Release\_MeCab.pyd.manifest

MeCab_wrap.obj : warning LNK4197: export 'init_MeCab' specified multiple times;

using first specification

   Creating library build\temp.win-amd64-2.7\Release\_MeCab.lib and object build\temp.win-amd64-2.7\Release\_MeCab.exp

MeCab_wrap.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) char const * __cdecl MeCab::getLastError(void)" (__imp_?getLastError@MeCab@@YAPEBDXZ) referenced in function "class MeCab::Tagger * __cdecl new_MeCab_Tagger(char const *)" (?new_MeCab_Tagger@@YAPEAVTagger@MeCab@@PEBD@Z)

MeCab_wrap.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class MeCab::Tagger * __cdecl MeCab::createTagger(char const *)" (__imp_?createTagger@MeCab@@YAPEAVTagger@1@PEBD@Z) referenced in function "class MeCab::Tagger * __cdecl new_MeCab_Tagger(char const *)" (?new_MeCab_Tagger@@YAPEAVTagger@MeCab@@PEBD@Z)

MeCab_wrap.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class MeCab::Model * __cdecl MeCab::createModel(char const *)" (__imp_?createModel@MeCab@@YAPEAVModel@1@PEBD@Z) referenced in function "class MeCab::Model * __cdecl new_MeCab_Model(char const *)" (?new_MeCab_Model@@YAPEAVModel@MeCab@@PEBD@Z)

MeCab_wrap.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class MeCab::Lattice * __cdecl MeCab::createLattice(void)" (__imp_?createLattice@MeCab@@YAPEAVLattice@1@XZ) referenced in function "class MeCab::Lattice * __cdecl new_MeCab_Lattice(void)" (?new_MeCab_Lattice@@YAPEAVLattice@MeCab@@XZ)

MeCab_wrap.obj : error LNK2019: unresolved external symbol "public: static charconst * __cdecl MeCab::Model::version(void)" (?version@Model@MeCab@@SAPEBDXZ) referenced in function _wrap_Model_version

MeCab_wrap.obj : error LNK2019: unresolved external symbol "public: static class MeCab::Model * __cdecl MeCab::Model::create(int,char * *)" (?create@Model@MeCab@@SAPEAV12@HPEAPEAD@Z) referenced in function _wrap_Model_create__SWIG_0

MeCab_wrap.obj : error LNK2019: unresolved external symbol "public: static class MeCab::Model * __cdecl MeCab::Model::create(char const *)" (?create@Model@MeCab@@SAPEAV12@PEBD@Z) referenced in function _wrap_Model_create__SWIG_1

MeCab_wrap.obj : error LNK2019: unresolved external symbol "public: static bool__cdecl MeCab::Tagger::parse(class MeCab::Model const &,class MeCab::Lattice *)" (?parse@Tagger@MeCab@@SA_NAEBVModel@2@PEAVLattice@2@@Z) referenced in function_wrap_Tagger_parse__SWIG_0

build\lib.win-amd64-2.7\_MeCab.pyd : fatal error LNK1120: 8 unresolved externals

 

error: command '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\link.exe"' failed with exit status 1120

 

 

 

 

【VC9を使いたい・・・】

よく見たら、VC10.0が使われてる。そのせいか?

これでWindows SDK for Windows 7Visual Studio 2008に統合できるらしい。

http://blogs.msdn.com/b/dd_jpn/archive/2009/08/25/9883335.aspx

"%ProgramFiles%\Microsoft SDKs\Windows\v7.1\Setup\WindowsSdkVer.exe" -version:v7.1

関係ないかも。

 

 

【VC9を使いたい・・・・・・】

以下を変更して、10.0を9.0に置換

C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd

が、ダメ。

 

running build

running build_py

running build_ext

building '_MeCab' extension

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\cl.exe /c /nologo /Ox/MD /W3 /GS- /DNDEBUG "-IC:\Program Files (x86)\MeCab\sdk" -IC:\Python27\include -IC:\Python27\PC /TpMeCab_wrap.cxx /Fobuild\temp.win-amd64-2.7\Release\MeCab_wrap.obj

MeCab_wrap.cxx

MeCab_wrap.cxx(3747) : warning C4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりません。/EHsc を指定してください。

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\link.exe /DLL /nologo/INCREMENTAL:NO "/LIBPATH:C:\Program Files (x86)\MeCab\sdk" /LIBPATH:C:\Python27

\libs /LIBPATH:C:\Python27\PCbuild\amd64 libmecab.lib /EXPORT:init_MeCab build\t

emp.win-amd64-2.7\Release\MeCab_wrap.obj /OUT:build\lib.win-amd64-2.7\_MeCab.pyd

 /IMPLIB:build\temp.win-amd64-2.7\Release\_MeCab.lib /MANIFESTFILE:build\temp.wi

n-amd64-2.7\Release\_MeCab.pyd.manifest

LINK : fatal error LNK1104: ファイル 'msvcprt.lib' を開くことができません。

error: command '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\link.

exe"' failed with exit status 1104

 

 

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\libにある'msvcprt.lib'をC:\Program Files (x86)\MeCab\sdkにいれると動くので、

どうやらpathが通っていない様子。

そこまでわかったが、pathの通し方がわからないため、

C:\Program Files (x86)\MeCab\sdkに直接放り込む。

# 明らかに良くないやり方だが。

で、エラー吐きまくり。

> build\lib.win-amd64-2.7\_MeCab.pyd : fatal error LNK1120: 外部参照 83 が未解決です。

もう諦めた・・・。

 

 

【最終的に入った】

他の方がビルドした後のファイル(下記参照)を使いました。

http://d.hatena.ne.jp/fgshun/20090910/1252571625

念のためMeCabも0.98を入れなおす。

 

それでもなお、Pythonで、import MeCabが通らず、

「有効なWin32アプリケーションではありません」とか言われる。

 

もう諦めて、Pythonを32bit版に変更したら、

やっとうまく動きました。

 

 

 

 

色々設定いじりまくったけど、大丈夫だろうか。