静かなる名辞

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


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

はじめに

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

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

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

  • setuptools
  • easy_install
  • conda

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

 目次

スポンサーリンク


凡ミスに注意

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

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

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

 これらで当てはまるものがない場合は、

  • インストールの失敗
  • インストールに使ったpipと使いたいpythonインタプリタの不一致

 あたりが主な原因の候補と考えられます。

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

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

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

 の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で色々な操作をするたびに出てきます。

 pipをアップグレードするデメリットは基本的にはないので*1、メッセージに表示されている「pip install --upgrade pip」を打ち込んでアップグレードをしても構いません。ただし、それによって上手くインストールできていないライブラリのインストールが上手くいくということも基本的にはありません。

 話を元に戻すと、

Successfully installed ***

 
 が出ていればライブラリのインストールは一応無事に行えています。インストールが完走していることがわかったら、「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コマンドを入力する際には、

  • pip
  • sudo pip
  • pip2/pip3

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

 これは「インストール作業を行ったのとは異なるpipでpip show しても正しく出てこない」という問題を回避するためです。pipとpip2/pip3が一致するとは限らないことは納得していただけると思います。また、sudo pipでインストールした場合、pythonをインストールした方法によってはrootユーザのパスと一般ユーザのパスが一致しないため、単にpipとすると違うpipになってしまう可能性も考えられます。

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上で行ってください。

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

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

 の2点に気をつけます。

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

 参考
【python】sysを使ってpythonインタプリタについて調べる - 静かなる名辞

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

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

python -m pip install ***

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

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

なぜこの対処で良いの?

 「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 ~」でインストールしてください。

 なお、このあたりの事情にはどのように環境を構築したのかも深く関わってきます。こちらの記事も御覧ください。

www.haya-programming.com

まとめ

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

*1:アップグレードに絡んだバグを踏む可能性もゼロではありませんが

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