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



# 概要
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'
```

# 解決方法
手元では２つの方法で解決できました。

## pipのアップグレード
１つは、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 のインストール ](https://www.tensorflow.org/install/pip?hl=ja)

仮想環境を作ったらとりあえずpipは最新にしておくのが良いと思いました。


## libの読み込み先を変更する

エラー自体は「_MeCab.cpython-38-darwin.so,」というライブラリを開くのに失敗しているということのようです。
したがって、この読み込み先を正しく設定することでもエラーを回避できます（pipをアップグレードするのが簡単で良い気はしますが）

このエラーで検索するといくつかヒットがあり、特に以下の記事が参考になりました。

[macでmecab-python3のimport error(Symbol not found)を解決](https://qiita.com/G1998G/items/2ad1b62c0285e478bfab)

ほぼ上記に従っているだけですが、一応、自環境での作業内容を記します。
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ファイルが３つ出てきますが、いずれも/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以外の２つのパスも変更したとありましたが、libmecabだけの変更でもエラーは回避できるようです。

# おわりに
仮想環境をつくったらpipのupgradeを忘れないようにしたいと思います。