#経緯
pythonでnumpyをインポートした際、ImportError: numpy.core.multiarray failed to importと言われたのでNumPyをアップグレードしたものの、なかなかこのエラーが消えてくれなかったので色々考えた。
#解決法1
###pipが古い
そもそものpipが古かったら、最新のnumpyをアップグレード出来ないのでpipをアップグレード
$ pip3 install --upgrade pip
$ pip3 install numpy --upgrade
これでもダメ?
#解決法2
###いくつかNumpyが入っていて、古いやつが呼ばれている
例えば、
$ python3
>>>import sys
>>>sys.path
['',
'/home/pi/.pyenv/versions/3.4.1/lib/python34.zip',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4/plat-linux',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4/lib-dynload',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4/site-packages']
上記のように打つと、パッケージを探してくれるディレクトリをずらずらと並べ立ててくれる。
この時に注目するべきところは、この記述の順番である。これはパッケージを探す順番である。
例えば、初めの '/home/pi/.pyenv/versions/3.4.1/lib/python34.zip'のディレクトリにnumpyが入っていればこいつを読み込まれてしまう。無ければ、次のディレクトリを探す。という感じだ。
過去に適当に他のディレクトリのpathを追加していてそいつが呼ばれているということもあり得る。
私は何も考えずに古いnumpyが入っている/usr/lib/python3/dist-packagesを追加していた。追加するのはいいが、一番最後に探してくれる追加の仕方をしていなかった。なので、最新のnumpyが入っている/home/pi/.pyenv/versions/3.4.1/lib/python3.4/site-packagesよりも早く呼び出されてしまっていたという事
#対策
pathの追加方法な何通りかあるが、方法によって動きが微妙に違う。
##追加方法1 .bashrcに追記
これは一番手っ取り早くpath追加できるが、パッケージの探索の際一番早く探索される
$ vi ~/.bashrc
# 以下の内容を追記
export PYTHONPATH="/usr/lib/python3/dist-packages"
保存して、再起動してpath一覧を見ると
$ python3
>>>import sys
>>>sys.path
['', '/usr/lib/python3/dist-packages',
'/home/pi/.pyenv/versions/3.4.1/lib/python34.zip',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4/plat-linux',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4/lib-dynload',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4/site-packages']
はい、一番先頭に来ましたね。
##追加方法2 .pth ファイルの追加
これは、検索してくれるディレクトリに.pthファイルを作成及びpathを追記しておくと、pthファイルのpathのディレクトリを一番最後に探索してくれるというものだ。
#検索対象ディレクトリに移動
$ cd /home/pi/.pyenv/versions/3.4.1/lib/python3.4/site-packages
$ vi path.pth
# 以下の内容を追記
/usr/lib/python3/dist-packages
保存して、再起動してpath一覧を見ると
$ python3
>>>import sys
>>>sys.path
['',
'/home/pi/.pyenv/versions/3.4.1/lib/python34.zip',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4/plat-linux',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4/lib-dynload',
'/home/pi/.pyenv/versions/3.4.1/lib/python3.4/site-packages',
'/usr/lib/python3/dist-packages']
最後に来ていることがわかりますね。他にも方法があるみたいなので、その辺は他のサイトにお任せします...