概要
pythonでimport MeCabを実行すると以下のエラーが出てきてしまいました。
% python
Python 3.8.6 (default, Jul 18 2021, 21:21:38)
[Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/[username]/vscode/workspace/test/.venv/lib/python3.8/site-packages/MeCab/__init__.py", line 10, in <module>
from . import _MeCab
ImportError: dlopen(/Users/[username]/vscode/workspace/test/.venv/lib/python3.8/site-packages/MeCab/_MeCab.cpython-38-darwin.so, 0x0002): symbol not found in flat namespace '__ZN5MeCab11createModelEPKc'
古いpipを使っていたのが原因のようで、pipを最新版にして、mecab-python3を再度pipすることでエラーなくimport できるようになりました。
% pip install --upgrade pip
% pip uninstall mecab-python3
% pip install mecab-python3
% python
Python 3.8.6 (default, Jul 18 2021, 21:21:38)
[Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
>>>
環境
% sw_vers
ProductName: macOS
ProductVersion: 12.3.1
BuildVersion: 21E258
エラーの発生方法
適当なフォルダで仮想環境を新規に作成してmecab-python3をpipしたあと、import MeCabを試します。
% mkdir test
% cd test
% python -m venv .venv
% source .venv/bin/activate
(.venv) % pip install mecab-python3
(.venv) % python
Python 3.8.6 (default, Jul 18 2021, 21:21:38)
[Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/[username]/vscode/workspace/test/.venv/lib/python3.8/site-packages/MeCab/__init__.py", line 10, in <module>
from . import _MeCab
ImportError: dlopen(/Users/[username]/vscode/workspace/test/.venv/lib/python3.8/site-packages/MeCab/_MeCab.cpython-38-darwin.so, 0x0002): symbol not found in flat namespace '__ZN5MeCab11createModelEPKc'
解決方法
手元では2つの方法で解決できました。
pipのアップグレード
1つは、pipをupgradeすることです。理由はわかりませんが、pipをアップグレードするとうまくいきました。
仮想環境を作った直後のpipのバージョンは以下
(.venv) % pip -V
pip 20.2.1 from /Users/[username]/vscode/workspace/test/.venv/lib/python3.8/site-packages/pip (python 3.8)
pipをアップグレードします。
(.venv) % pip install --upgrade pip
% pip install --upgrade pip
Collecting pip
Using cached pip-22.1.1-py3-none-any.whl (2.1 MB)
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 20.2.1
Uninstalling pip-20.2.1:
Successfully uninstalled pip-20.2.1
Successfully installed pip-22.1.1
バージョンが最新になっていることを確認します。
(.venv) % pip -V
pip 22.1.1 from /Users/[username]/vscode/workspace/test/.venv/lib/python3.8/site-packages/pip (python 3.8)
mecab-python3を再インストールします。エラーなくimportできることを確認します。
% pip uninstall mecab-python3
% pip install mecab-python3
% python
Python 3.8.6 (default, Jul 18 2021, 21:21:38)
[Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
>>>
ちなみにtensorflowのインストールもpipが古いと失敗するようです。
pip での TensorFlow のインストール
仮想環境を作ったらとりあえずpipは最新にしておくのが良いと思いました。
libの読み込み先を変更する
エラー自体は「_MeCab.cpython-38-darwin.so,」というライブラリを開くのに失敗しているということのようです。
したがって、この読み込み先を正しく設定することでもエラーを回避できます(pipをアップグレードするのが簡単で良い気はしますが)
このエラーで検索するといくつかヒットがあり、特に以下の記事が参考になりました。
macでmecab-python3のimport error(Symbol not found)を解決
ほぼ上記に従っているだけですが、一応、自環境での作業内容を記します。
otoolで依存している共有ライブラリを確認します。
% otool -L /Users/[username]/vscode/workspace/LineStrongWord/.venv/lib/python3.8/site-packages/MeCab/_MeCab.cpython-38-darwin.so
/Users/[username]/vscode/workspace/LineStrongWord/.venv/lib/python3.8/site-packages/MeCab/_MeCab.cpython-38-darwin.so:
/usr/lib/libmecab.dylib (compatibility version 1.0.0, current version 972.10.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1300.23.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
.dylibファイルが3つ出てきますが、いずれも/usr/libには存在していません。
% ls /usr/lib | grep libmecab.dylib
% ls /usr/lib | grep libc++.1.dylib
% ls /usr/lib | grep libSystem.B.dylib
正しい場所がどこにあるか探します。
libmecab.dylibは/usr/local/libにあるようです。
% sudo find / -name libmecab.dylib
/usr/local/lib/libmecab.dylib
libc++.1.dylibとlibSystem.B.dylibについては、同様にfindで探したところ、ルートフォルダ下のどこにも存在していないようでした。
とりあえず、libmecabのパスだけ正しく再設定します。
% install_name_tool -change "/usr/lib/libmecab.dylib" /usr/local/lib/libmecab.dylib /Users/[username]/vscode/workspace/LineStrongWord/.venv/lib/python3.8/site-packages/MeCab/_MeCab.cpython-38-darwin.so
仮想環境に入ってimport MeCabを試します。
(.venv) % python
% python
Python 3.8.6 (default, Jul 18 2021, 21:21:38)
[Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
>>>
成功しました。上記記事ではlibmecab以外の2つのパスも変更したとありましたが、libmecabだけの変更でもエラーは回避できるようです。
おわりに
仮想環境をつくったらpipのupgradeを忘れないようにしたいと思います。