概要
初心者が躓きがちなimportエラーの対処法をまとめてみました。
以下$
から始まるものはターミナルで、>>>
で始まるものはpythonコンソールで実行してみてください。
1. pythonのバージョン
###1. 1. ターミナル
$ python -V
=> Python 3.6.5
pyenvなどを使ってる場合は、ちゃんと使いたいインタプリタかを確認。
$ pyenv versions
system
* 3.6.5 (set by /home/user/.pyenv/version)
$ which python
/home/user/.pyenv/shims/python3
1. 2. 実行環境
>>> import sys
>>> sys.executable # インタプリタへのパス
'/path/to/executable/bin/python'
>>> sys.version # バージョン
'3.6.5 (default, Jul 20 2018, 02:34:00)]'
2系と3系が共存している場合は3のつもりが2を呼び出してたりすることがあります。
2. パッケージがインストールされているか
$ pip freeze | grep numpy
=> numpy==1.14.4
ここにない場合はpip install
などでインストールしましょう。
自作パッケージの場合は次の項目へ。
3. パスが通っているか
import文を読むとpythonは既定のパスにパッケージを探しに行きます。
そこにないとimportできないので確認。
>>> import sys
>>> sys.path
['', '/home/user/.pyenv/versions/3.6.5/lib/python36.zip', '/home/user/.pyenv/versions/3.6.5/lib/python3.6', '/home/user/.pyenv/versions/3.6.5/lib/python3.6/lib-dynload', '/home/user/.local/lib/python3.6/site-packages', '/home/user/.pyenv/versions/3.6.5/lib/python3.6/site-packages']
パスが通っていない場合は、以下のいずれかを試してください。
3. 1. パッケージをパスが通っている場所に置く
上記で調べたうちのどこか(path/to/python3.6/site-packages
など)に置くか、シンボリックリンクを張ってください。
3. 2. パスを追加する
>>> sys.path.append('/path/to/module/')
3. 3. PYTHONPATHを設定する
$ export PYTHONPATH="/path/to/your/module/:${PYTHONPATH}"
などとシェルの設定ファイル(bashrcやzshrc)に書いて反映させる。
自作パッケージの場合、__init__.pyを忘れないように
mydirディレクトリのmymoduleモジュールをimportする場合
from mydir import mymodule
などと書きますが、from mydirの部分でImportErrorが出ることがあります。
これは__init__.pyがディレクトリ下にないとmydirがパッケージとして認識されないからです。
空でいいので__init__.pyをおいておきましょう。
4. 相対importの場合、実行場所に気をつける
相対importとは、
from . import mymodule
from ..foo import bar
のように、相対的なパス指定でのimportのことです。
この場合、このコードを実行している場所からの相対パスになるので注意しましょう。
5. 同じ名前の別のファイルやフォルダがプロジェクト内にないか
たとえばimport os
をしたい場合に、osという同じ名前のファイル(os.py)やフォルダが
実行ファイルの付近にあるとそちらが優先的にimport対象となります。
意外と盲点なので、名前をつけるときは被らないように気をつけましょう。
6. 循環importをしていないか
import b
import a
これは循環参照なのでエラーになります。