LoginSignup
1
0

More than 1 year has passed since last update.

【python】import MeCabに失敗したがpipをupgradeしたら直った

Posted at

概要

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を忘れないようにしたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0