mecab-pythonをPython(amd64)にインストールする覚書

mecab-pythonwindowsで動かそうと思って苦戦してから早数年。
今回再び苦戦したので、忘れない内に手順を覚書きしておこうと思います。

今回挑戦した環境は下記の通り。

security-fix当てろって・・・?
ソースからコンパイルは面倒くさくって放ってるんだ・・・・・・。


主に参考にしたのはWindowsにmecab-pythonを導入及びWindows での mecab 0.993 python バインディングモジュール(32/64ビット)の作り方メモです。偉大な先人達に心から感謝します。

PythonMeCabのインストール

Python及びMeCabはバイナリが配布されてますので、バイナリを落としてきて、インストールしましょう。
Python2.6.6はココ、MeCab0.996はコッチから落とせるはずです。
インストールしたらパスを

に通すのを忘れずに。

Pythonバインディングのインストール

Pythonバインディングこのリストから、インストールしたMeCabにあった物を落としてきます。今回使うのは"mecab-python-0.996.tar.gz"なので、このファイルを落としてきて、適当な場所に解凍しましょう。


ここからはWindowsにmecab-pythonを導入を参考に"setup.pyの書き換え"、"vcvarsall.batの入手"、"mecab.hに追記"を行っていきます。詳細は、元記事が詳しいのでそちらを参照して下さい。
なお、"mecab.hに追記"の項で触れられている"C:\Progam Files\MeCab\sdk\mecab.h"は今回の環境では"C:\Program Files (x86)\MeCab\sdk\mecab.h"に読み替えます。(念の為


本番はこれからです。
ここまでやり終えて、「よーし、動かすぞー!!」と意気込んでいたら

(tit_prj) C:\MyDocuments\Python\misc\mecab-python-0.996>python setup.py bdist_wininst
running bdist_wininst
running build
running build_py
running build_ext
building '_MeCab' extension
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG "-IC:\Program Files (x86)\MeCab\sdk" -IC:\Python26\include -IC:\MyDocuments\Python\venv\tit_prj\PC /TpMeCab_wrap.cxx /Fobuild\temp.win-amd64-2.6\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 9.0\VC\BIN\amd64\link.exe /DLL /nologo /INCREMENTAL:NO "/LIBPATH:C:\Program Files (x86)\MeCab\sdk" /LIBPATH:C:\Python26\Libs /LIBPATH:C:\MyDocuments\Python\venv\tit_prj\libs /LIBPATH:C:\MyDocuments\Python\venv\tit_prj\PCbuild\amd64 libmecab.lib /EXPORT:init_MeCab build\temp.win-amd64-2.6\Release\MeCab_wrap.obj /OUT:build\lib.win-amd64-2.6\_MeCab.pyd /IMPLIB:build\temp.win-amd64-2.6\Release\_MeCab.lib /MANIFESTFILE:build\temp.win-amd64-2.6\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.6\Release\_MeCab.lib and object build\temp.win-amd64-2.6\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 char const * __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 char const * __cdecl MeCab::Tagger::version(void)" (?version@Tagger@MeCab@@SAPEBDXZ) referenced in function _wrap_Tagger_version
build\lib.win-amd64-2.6\_MeCab.pyd : fatal error LNK1120: 11 unresolved externals
error: command '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\link.exe"' failed with exit status 1120

と、盛大にコケました。*4 *5
libmecab.dllもlibmecab.libもパス通ってるのに何でだろーと思って、取り敢えずlibやdllをsetup.pyと同じフォルダに突っ込むも結果は変わらず。色々とググっている内にWindows での mecab 0.993 python バインディングモジュール(32/64ビット)の作り方メモを見つけました。

64ビットの壁を超える

適当なこと言っていると詳しい方に叱られそうですが、32bitでコンパイルされたデフォルトのlibを64bit環境でリンクしようとしてるのは、確かに何かが不味そうな気がしてきます。
ここでMeCabも64bit環境向けにコンパイルすれば多分完璧だったんでしょうが、これを面倒臭がった猫はWindows での mecab 0.993 python バインディングモジュール(32/64ビット)の作り方メモの記事で配布されている64bit向けのlibを使うことを思いつきました。バージョンが0.993と0.996で違ったり、MeCabは32bitのままだったりとサボりまくりですが、取り敢えずやってみます。
上記記事の最後の方で配布されているzipを頂戴してきて、libmecab.libをsetup.pyと同じディレクトリに配置します。

(tit_prj) C:\MyDocuments\Python\misc\mecab-python-0.996>python setup.py bdist_wininst
running bdist_wininst
running build
running build_py
creating build
creating build\lib.win-amd64-2.6
copying MeCab.py -> build\lib.win-amd64-2.6
running build_ext
building '_MeCab' extension
creating build\temp.win-amd64-2.6
creating build\temp.win-amd64-2.6\Release
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG "-IC:\Program Files (x86)\MeCab\sdk" -IC:\Python26\include -IC:\MyDocuments\Python\venv\tit_prj\PC /TpMeCab_wrap.cxx /Fobuild\temp.win-amd64-2.6\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 9.0\VC\BIN\amd64\link.exe /DLL /nologo /INCREMENTAL:NO "/LIBPATH:C:\Program Files (x86)\MeCab\sdk" /LIBPATH:C:\Python26\Libs /LIBPATH:C:\MyDocuments\Python\venv\tit_prj\libs /LIBPATH:C:\MyDocuments\Python\venv\tit_prj\PCbuild\amd64 libmecab.lib /EXPORT:init_MeCab build\temp.win-amd64-2.6\Release\MeCab_wrap.obj /OUT:build\lib.win-amd64-2.6\_MeCab.pyd /IMPLIB:build\temp.win-amd64-2.6\Release\_MeCab.lib /MANIFESTFILE:build\temp.win-amd64-2.6\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.6\Release\_MeCab.lib and object build\temp.win-amd64-2.6\Release\_MeCab.exp
C:\Program Files\Microsoft SDKs\Windows\v7.0\bin\x64\mt.exe -nologo -manifest build\temp.win-amd64-2.6\Release\_MeCab.pyd.manifest -outputresource:build\lib.win-amd64-2.6\_MeCab.pyd;2
installing to build\bdist.win-amd64\wininst
running install_lib
creating build\bdist.win-amd64
creating build\bdist.win-amd64\wininst
creating build\bdist.win-amd64\wininst\PLATLIB
copying build\lib.win-amd64-2.6\MeCab.py -> build\bdist.win-amd64\wininst\PLATLIB
copying build\lib.win-amd64-2.6\_MeCab.pyd -> build\bdist.win-amd64\wininst\PLATLIB
running install_egg_info
Writing build\bdist.win-amd64\wininst\PLATLIB\mecab_python-0.996-py2.6.egg-info
creating 'c:\users\holly\appdata\local\temp\tmpmyhto9.zip' and adding '.' to it
adding 'PLATLIB\MeCab.py'
adding 'PLATLIB\mecab_python-0.996-py2.6.egg-info'
adding 'PLATLIB\_MeCab.pyd'
creating 'c:\users\holly\appdata\local\temp\tmpmyhto9.zip' and adding '.' to it
adding 'PLATLIB\MeCab.py'
adding 'PLATLIB\mecab_python-0.996-py2.6.egg-info'
adding 'PLATLIB\_MeCab.pyd'
creating dist
removing 'build\bdist.win-amd64\wininst' (and everything under it)

うん、通ったっぽい。*6
ちなみに"python setup.py bdist_wininst"はインストール用EXEを作るオプションなので、まだPython環境下にMeCabラッパーはインストールされていません。"python setup.py install"として、Python環境下にインストールしましょう。*7

教訓

MeCabは32bit仕様のままだったり、0.993をコンパイルしたlibを流用してたり、色々突っ込みどころは有りますが取り敢えず動いてるので先にやりたい事をやろうと思います。
Win7の64bit環境でもリンクでコケてないエントリがある辺り、恐らく猫の敗因はPythonamd64だったことな気がしています。32/64bitの違いを普段から意識してないから、こんな事になるんですね。(猫くらいでしょうか)


時間ができたら自分で64bit MeCabコンパイルしたいなぁと思いつつ、今日のエントリを締めくくろうと思います。*8

*1:Pythonのインストール先を"C:\Python26\"とした場合

*2:デフォルトのインストール先の場合

*3:32bit環境の場合は多分"C:\Program Files\MeCab\bin"

*4:setup.pyのオプションがbdist_wininstになっていますが、buildでもリンカでコケるのは同じでした

*5:Global環境を汚したくなくてvirtualenv下でコンパイルしようとしているので所々パスが変ですが、適に読み替えて下さい

*6:やった後で気がついたんですが、setup.py内で"library_dirs=['.']"とすべき所を、実はしていませんでした。ローカルは勝手に読んでくれたんですかね・・・・・・?

*7:virtualenv環境下でインストールしているので、この場合Global環境下ではMeCabは使えません

*8:ゼミ直前なのに何書いてるんですかねぇ・・・・・・