ローカル環境にて、仮想通貨のMA(移動平均)の数値取りたくてpipライブラリのnumpyを使ったときのエラーです。
初期環境は以下
mac 12.0.1(Monterey)
Python 3.9.10
numpy 1.22.2
pip 22.0.3
普段通り、ライブラリのインストールを進めて動作を確認します。
$ pip3 install numpy
次にnumpyのimportです。
pyファイルに以下記載して動作の確認
import numpy as np
ここで以下エラーが出ます。
Original error was: No module named ‘numpy.core._multiarray_umath’
今までインストールしたライブラリではこのようなエラーは一切なかったので戸惑います。
結論から言うとおそらくバージョンによるエラー?
おそらく、と言うのは色々やってみて結果的に正常動作したため、変更部分から考察して得られた答えと言う意味です。
ぼくが利用していたPython 3.9.10ではなぜかnumpyがうまく動かなかったのですが、試しにレンタルサーバー(ロリポップ)で同じようにnumpyを使ってみたらそちらは動きました。
確認すると、バージョンに違いがあります。
なので、今回はそのレンタルサーバーに入っているPythonのバージョン3.7.12に合わせてローカルで環境を整えてみました。
作業としては、pyenvを利用してPythonバージョンを変えてから、それにあったライブラリで動作するか検証。
すると、こちらで問題なく動作しました。
pyenvというのは、macでよく使われるPythonのバージョン切り替え用の補助ツールみたいなものです。
わざわざバージョン切り替えだけでこのコマンドラインツールをインストールするのがだるいとは思いますが、実際これなしでバージョンを変更する方がよっぽどだるかったりするので、それならばこれに頼った方が無難です。
処置としては以下になります。
・Homebrewをインストール
・pyenvをインストール
・任意のバージョンのPythonをインストール
・インストールしたPythonにあったpipとnumpyをインストール
Pythonのバージョン切り替え、特にダウングレードは、基本的にこのpyenvというものを使った方がスムーズにできるようです。
今までこちらは使ったことがなかったのですが、関連情報もたくさんあり、割と簡単にできました。
MacOSでのPythonのバージョン切り替え方法を現役エンジニアが解説【初心者向け】
ぼくがこの作業でつまづいた部分は、切り替えコマンドが動作しないところでした。
色々調べた結果、以下記述をそれぞれ.zshrcファイルと.bash_profileファイルに記述したところ無事に反映できました。
記述自体は結果的に動いたからいいのですが、無駄な部分はあるかもしれないので悪しからず。
まず、お決まりのglobalコマンド。
次にopenコマンドでファイルを開いて、.zshrcに3行、.bash_profileに4行を記載。
念のためにファイル一番上に記載推奨。
$ pyenv global 3.7.12
$ open ~/.zshrc
export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init --path)" eval "$(pyenv init -)"
$ open ~/.bash_profile
export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)"
ちなみにこの二つのファイルはbash起動時とzsh起動時に自動実行されるスクリプトなので手作業でコマンドを実行しても同じ結果が得られます。
macの.bash_profileと.bashrc
https://qiita.com/Yuuki557/items/bda36910605b308122d2
最後にbash_profileの保存を適用して完了です。
$ source ~/.bash_profile
適用後に試しにターミナルの再起動をしてバージョンの確認をしてみてください。
今回はPythonのバージョンを変えることで対処していますが、原因がはっきりとしていないので、これでも治らない時は「Anaconda」を利用した環境で、numpyの導入を考えた方がいいかもしれないです。
最近、ccxtを利用した取引所のAPI取得にハマっていますが、予想以上にエラーが多くて苦戦している模様。
下の件は読み込み時のエラーですが、結局どのエラーも割と単純な原因のものが多い傾向になります。
【Python + ccxt】IP制限のを利用したAPIの読み込みエラー「”code”:-2015」の原因と対処法
そのため、エラー内容を読み解くよりもネットに拡散する既存情報から原因を読み解く方が案外近道だったりします。