環境
- macOS Big Sur バージョン 11.0.1
- pyenv で python をインストール
問題
python で何気なく pandas をインポートしようとしたところ、
import pandas as pd
次のようなエラーが発生しました。
Traceback (most recent call last):
...(中略)
ImportError: No module named '_bz2'
原因
pyenv で python をインストールする際に、コンパイラが bzip2 というパッケージを認識していなかったために、python の bz2 ライブラリがインストールされず不完全な状態になっていると予想できます。
なので、pyenv でインストールした時に次のような warning が表示されていたことでしょう。
$ pyenv install 3.9.0
...(中略)
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
解決方法
コンパイラに bzip2 ライブラリを認識させた状態で、 pyenv を使って python を再インストールします。
1. bzip2 パッケージをインストール
$ brew install bzip2
インストールの途中で、おそらく次のようなメッセージが出てくると思います。これが非常に重要です。
For compilers to find bzip2 you may need to set:
export LDFLAGS="-L/usr/local/opt/bzip2/lib"
export CPPFLAGS="-I/usr/local/opt/bzip2/include"
2. LDFLAGS と CPPFLAGS を設定
brew でインストールしただけでは、 pyenv で python をビルドする際に bzip2 パッケージをコンパイラは認識してくれません。
コンパイラに認識させるためには、先ほど出てきたメッセージの通り、LDFLAGS
と CPPFLAGS
を設定する必要があります。
そのために、.zprofile または .bash_profile の中に次の文を付け加えます。
export LDFLAGS="-L/usr/local/opt/bzip2/lib"
export CPPFLAGS="-I/usr/local/opt/bzip2/include"
前に別の LDFLAGS
と CPPFLAGS
を設定していた場合、これらの FLAG はスペースでつなげることで複数指定することができるので、次のようにしても良いでしょう。
export LDFLAGS="$LDFLAGS -L/usr/local/opt/bzip2/lib"
export CPPFLAGS="$CPPFLAGS -I/usr/local/opt/bzip2/include"
3. python を再インストール
pyenv でお好みのバージョンをインストールします。
$ pyenv install <version>
おそらく先ほどの warning は消えていたと思います。
その後は、いつもの pyenv によるインストール手順に従い、メインで使う python のバージョンを指定し、シェルをリロードします。
$ pyenv global <先ほどインストールしたバージョン>
$ exec $SHELL -l
おそらく pandas を読み込めるようになっているはずです。
(参考) Linux の場合
以下の記事が参考になります。
scikit-learn で No module named '_bz2' というエラーがでる問題
感想
Linux で同じエラーに対処する方法はたくさん見つかったのですが、macOS でのエラー対処法は見つからなかったので、自力で解決するしかなく大変でした。