146
153

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-09-03

概要

初心者が躓きがちな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

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

146
153
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
146
153

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?