No module named 'cv2'

pythonで詰んだお話。同じ事に陥った人でもあまり参考にならないかもしれないので流し見程度でオナシャス。

●環境
macOS Mojave 10.14
Homebrew 1.8.5
Python 3.6.4 → 3.7.1
pyenv 1.2.8

事の発端

オタクなので画像処理をする事となり、OpenCVを使う機会ができた。以前インストールしているはずなので、とりあえずバージョン確認をしておこうという事で確認方法を探す。
ターミナルで以下のコードを実行しようとした。

>>> import cv2 
>>> cv2.__version__

" >>> import cv2 "を入力した時点で、このエラー文が出現。

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    import cv2
ModuleNotFoundError: No module named 'cv2'

( ´◔‸◔`)

cv2モジュールがないとか言われた。

Python3.6を使ってるからか?cv2だから2系じゃないと動かないのかな?などと言う安直な考えで2.7.10に切り替えて再度実行してみたものの、不変。

OpenCVのバージョン確認をする以前にcv2が含まれるコードのコンパイルで詰んでしまった。10000万回詰んだねこれ。

解決法の模索

何か解決に繋がるかもしれんと思い、直接確認する以外の方法でバージョンを確認。ファイルの位置検索を使った。

$ find / -name opencv
...
/usr/local/Cellar/opencv
/usr/local/Cellar/opencv/3.4.3/include/opencv
...

3.4.3。

次にターミナルでOpenCVにアクセス。前に使った時めっちゃライブラリを入れた気がすんなと思い、libを開く。

$ cd /usr/local/Cellar/opencv/3.4.3/lib
$ ls 
...
pkgconfig
python2.7
python3.7

おるやんけ!おるやんけ!3.7おるやんけ!

3.6.4ではダメな雰囲気になってきたな。

$ tree python3.7
python3.7
└── site-packages
    └── cv2.cpython-37m-darwin.so

cv2さんおるわ。

とりあえずpythonのバージョンを切り替えてみる。

$ pyenv install 3.7.1

これをやったらエラーが出た。多分前回と同じ流れだろうと思い以下を入力。

$ xcode-select --install

改めてinstallしてみたものの、同じエラーが出た。なんでやろ。

どうやらMojaveで起きるエラーらしい。XcodeがMojaveの諸々に追いついてないらいい(ここらへんは全く知らないので曖昧表現)

$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
macOS_SDK_headers_for_macOS_10.14.pkg -target /
installer: Package name is macOS_SDK_headers_for_macOS_10.14
installer: Upgrading at base path /
installer: The upgrade was successful.
$ pyenv install 3.7.1
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.1.tar.xz...
-> https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tar.xz
Installing Python-3.7.1...
python-build: use readline from homebrew
Installed Python-3.7.1 to /Users/XXXXXX/.pyenv/versions/3.7.1
$ pyenv global 3.7.1
$ Python -V
Python 3.7.1

先人の知恵を参考に上の手順を踏んだ。結構時間がかかる。

Pythonのバージョン管理の問題は解決した。cv2の方はどうなんだろうか。

$ python 
>>> import cv2
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    import cv2
ModuleNotFoundError: No module named 'cv2'

あ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜これあれだ、パスが通ってないのかもしれん。

$ ln -s /usr/local/Cellar/opencv/3.4.3/lib/python3.7/site-packages/cv2.cpython-37m-darwin.so ~/.pyenv/versions/3.7.1/lib/python3.7/site-packages/

ここは人によって違う箇所なので注意。

例のコードを実行。

>>> import cv2
ImportError: numpy.core.multiarray failed to import
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    import cv2
ImportError: numpy.core.multiarray failed to import

段々やる気が沈んできた。たぶんいま日本海溝に沈降しとる。

と、よく見てみると先とエラー文が異なっている。
" ImportError: numpy.core.multiarray failed to import "はつまりnumpyが古いよって事らしいので、おとなしくアップデート。

$ pip install numpy --upgrade

アップデート後、再び実行。

エラー出ず!

無事に実行されました。

実行結果はこちら↓

'3.4.3'

こんな事に4時間くらいかけた。よーしパパ、画像処理しちゃうぞ〜。

参考文献

marumaru.tonkotsu.jp
algorithm.joho.info
qiita.com


ちなみに画像処理の知識はありません。死んだ。