Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
128
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@ktgwaaa

PythonでImportErrorが起きたときの確認事項まとめ

概要

初心者が躓きがちな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をしていないか

a.py
import b
b.py
import a

これは循環参照なのでエラーになります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
128
Help us understand the problem. What are the problem?