LoginSignup
1
4

More than 3 years have passed since last update.

macOS で pandas をインポートしようとしたら No module named '_bz2' というエラーが出る

Posted at

環境

  • 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 パッケージをコンパイラは認識してくれません。

コンパイラに認識させるためには、先ほど出てきたメッセージの通り、LDFLAGSCPPFLAGS を設定する必要があります。

そのために、.zprofile または .bash_profile の中に次の文を付け加えます。

export LDFLAGS="-L/usr/local/opt/bzip2/lib"
export CPPFLAGS="-I/usr/local/opt/bzip2/include"

前に別の LDFLAGSCPPFLAGS を設定していた場合、これらの 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 でのエラー対処法は見つからなかったので、自力で解決するしかなく大変でした。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4