静かなる名辞

pythonとプログラミングのこと

【python】ImportError: No module named '***'の対処法

はじめに

 ライブラリをインストールして、いざ使おうと思ったら「ImportError: No module named '***'」が出ちゃった、という経験をされる方は多いと思います。

 その対処法、トラブルシューティング手順についてまとめておきます。

 なお、この記事はpipでインストールした場合について説明します。

  • setuptools
  • easy_install
  • conda

 などを用いた場合(あるいは自作モジュールの場合)、この記事の内容をそのまま使うことはできません(ある程度は参考になると思います)。

 目次

凡ミスに注意

 色々な凡ミスの可能性が考えられます。

  • ライブラリの名前を間違えていた(スペルミス。numpyをnampyにしてしまうなど)
  • 仮想環境をactivateしていなかった
  • (自作モジュールの場合)相対パスを間違えた
  • その他……

 思いつく範囲でチェックします。

 思いつかない場合は、

 あたりが主な原因の候補です。

まずはインストール作業を見直す

 最低限把握しておくべきこととして、

  • 打ったコマンド
  • インストール時にコマンドを打った結果出たメッセージ

 の2つがあります。これがわからないと困ります。

 この2つを問題なく把握できていれば、以下の手順でトラブルシュートしていきます。

ちゃんとインストールできているか確認する

 インストール作業をチェックします。

 まず、インストール時のメッセージを確認します。

 メッセージの最後の方に

Successfully installed ***

 というようなメッセージが出ていれば、とりあえずインストールは完走したということになります。「Error」とか「Failed」といった単語が最後の方で出ているのなら、インストールに失敗していますから、ライブラリ名とエラーメッセージの組み合わせで検索したりして対策を模索することになります。

 なお、

You are using pip version 9.0.3, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

 のようなメッセージが出ることがありますが(バージョンの数字は環境によって異なります)、これはインストールの成否とは関係ありません

 「古いバージョンのpipを使っているみたいだけど、アップデートできますよ」というそれだけのメッセージですね。pipで色々な操作をするたびに出てきます。

 インストールが完走していることがわかったら、「pip show ***」でライブラリの情報を確認します。以下に例を示します。

$ pip show numpy
Name: numpy
Version: 1.14.1
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@python.org
License: BSD
Location: インストールされているディレクトリ
Requires: 

 インストールされているディレクトリを控えておきます。

 なお、この作業を行う際に重要なのは、インストール時に打ったpipコマンドと同じpipを使うことです。

  • pip
  • sudo pip
  • pip2/pip3

 色々あると思いますが、とにかくインストール時に「pip install ***」を打ったなら「pip show ***」としますし、「sudo pip install ***」だったのなら「sudo pip show ***」としてください。仮想環境の有無やアクティベートしていたかどうかなども揃えてください。

pythonを起動して確認する

 pythonの対話的インタプリタを起動し、以下のプログラムを実行します。あるいは、以下のプログラムを書いた.pyファイルを作成し、それをインタプリタから実行します。

import sys
print(sys.version)
print(sys.prefix)
print(sys.path)

 pythonのバージョン、インストール先、import時に参照されるパスなどの情報が得られます。

 また、コマンドライン(shellやコマンドプロンプト)から以下のコマンドを打って得られる情報も有用です。

# unix系の場合
which python
# windowsの場合
where python

 こちらも普段使っているpythonインタプリタで行います。pythonコマンドを用いているならpythonコマンドを、python3コマンドを用いているならpython3コマンドで実施してください。jupyter notebookを使っている人なら、jupyter上で行ってください。

 ここで、上で確認したライブラリのインストール先と、これらの情報が一致しているかを確認します。見方としては、

  • 普通、ライブラリはsys.prefix以下のディレクトリに存在します(たとえばsys.prefixのディレクトリ/lib/python3.5/site-packages)など
  • sys.path内にライブラリがインストールされているディレクトリが存在しているはずです

 の2点に気をつけます。

 これが変なことになっているケースが相当多いと思います。

インストール先が変だったら

 使いたいpythonインタプリタと紐付いたpipを使ってインストールし直してください。確実な方法としては、

python -m pip install ***

 があります(pythonコマンドで使いたいpythonが起動することが大前提。python3コマンドを使っているならpython3コマンドを使う必要がありますし、仮想環境を使っているならactivateした状態で行ってください)。

 とりあえずこれでインストールできると思いますが、うまく行ったら「python -m pip」に該当するpipコマンドを探しておくと今後はかどります*1

なぜこの対処で良いの?

 「pip installは成功したのにimportできない」という症状の95%くらいは、pipでインストールした先のpythonとimportを実行したpythonが異なっていることに起因しているからです。

 そもそもpipは特定のpythonインタプリタに紐付いているモジュールです。複数のpythonがインストールされているような環境では、使いたいpythonに紐付いたpipを適切に使う必要があります。

 たとえばpython2がデフォルトの環境にpython3をインストールしてpython3コマンドで使っているというような場合、pipコマンドで立ち上がるのはシステムデフォルトのpython2です。pipコマンドがパスの読み込みの優先順位で先に位置しているからです。

 こういう場合、pip3やpip3.6などのコマンドが用意されていてパスで読み込めれば、それらのコマンドを用いてインストールすることができます。

 また、仮想環境を立ち上げた状態で「sudo pip ~」と打ち込んでしまうパターンもあります。大抵の仮想環境はパスをいじって仮想環境としての動作を実現していますが、sudoを使った場合は一般ユーザーとは異なった環境変数で実行されるため、仮想環境に対してのインストールがなされません。仮想環境は管理者権限がなくても書き込み/変更できる場所に作るのが一般的なので、「pip ~」でインストールしてください。

まとめ

 pip周りは意外と慣れないうちはハマるので、仕組みを理解してハマらないようにしましょう。「ネットに書いてあるインストール手順をそのままコピペしています」という人は要注意です。

*1:とはいえ混乱の元なので、いっそ公式で「python -m pip」を推奨してくれないものか。「pyvenv」みたいにさ