【Python】ImportErrorを解決する方法

パイソンのインポートエラーを解決する方法

こんにちは、にわこまです。

今回は、pythonで他ディレクトリの他ファイルをインポートするときに発生するエラーについて解決する方法を紹介します。以下のようなエラー文の解決方法を紹介します。

ImportError: attempted relative import with no known parent package

 

 

誤字脱字や分かりにくい・分からない箇所がありましたら、ご連絡お願いいたします。

 

 

スポンサードサーチ


ImportErrorの原因と解決方法

原因は、「カレントディレクトリより上位のディレクトリのファイルはインポートできない」です。

 

解決方法

1.カレントディレクトリにインポートしたいファイルを持ってくる。

2.上位のディレクトリから実行する。

3.「sys.path」に対象のディレクトリを追加する。

  

 

エラー状況

まず、今回のインポートエラーが発生する状況を説明します。

以下のようなディレクトリ、ファイル関係だと想定します。

dirA
  ├ A.py
  ├ dirB
  │   └ B.py
  └ dirC
       ├ C01.py
       ├ C02.py
       └ C03.py

 

また、A.py、B.py、C01.py、C02.py、C03.pyそれぞれのコードを以下に示します。

# ===== A.py =====
from dirC.C02 import funcCB

if __name__ == '__main__':
    funcCB()
# ===== B.py =====
def funcB():
    print("B -- funcB")
# ===== C01.py =====
from ..dirB.B import funcB

def funcC():
    print("C -- funcC")

def funcCB():
    print("C -- funcCB : ", end="")
    funcB()

if __name__ == '__main__':
    funcC()
    funcCB()
# ===== C02.py =====
from dirB.B import funcB

def funcC():
    print("C -- funcC")

def funcCB():
    print("C -- funcCB : ", end="")
    funcB()

if __name__ == '__main__':
    funcC()
    funcCB()
# ===== C03.py =====
import sys
sys.path.append("../dirB")
from B import funcB

def funcC():
    print("C -- funcC")

def funcCB():
    print("C -- funcCB : ", end="")
    funcB()

if __name__ == '__main__':
    funcC()
    funcCB()

 

dirCのC01.pyでdirBにあるB.pyの関数funcBを使用したいと考えます。このとき、C01.pyのインポート文は「from ..dirB.B import funcB」のように書けると思います。

カレントディレクトリをdirCにし、C01.pyを実行すると以下のようなインポートエラーが発生します。

Traceback (most recent call last):
  File "C01.py", line 2, in <module>
    from ..dirB.B import funcB
ImportError: attempted relative import with no known parent package

 

 

解決方法1:カレントディレクトリにインポートしたいファイルを持ってくる

B.pyをdirCに持ってくるということです。また、C01.pyの2行目のインポート文を以下のように変更することで解決することができます。

from B import funcB

  

カレントディレクトリはdirCのまま、インポート文変更後に実行すると以下のように出力されます。

C -- funcC
C -- funcCB : B -- funcB

 

 

解決方法2:上位のディレクトリから実行する

カレントディレクトリをdirAに変更するということです。また、C01.pyの2行目のインポート文を以下のように変更することで解決できます。(変更後のファイルはC02.pyです。)

from dirB.B import funcB

  

さらに、dirAにファイル(A.py)を作成し、そのファイルからC02.pyをインポートすることで利用します。

カレントディレクトリがdirAの状態で、A.pyを実行すると以下のように出力されます。

C -- funcCB : B -- funcB

  

 

解決方法3:「sys.path」に対象のディレクトリを追加する

sys.pathに「../dirB」を追加するということです。

C01.pyの2行目のインポート文を以下の3行に変更することで解決することができます。(変更したファイルはC03.pyになります。)

import sys
sys.path.append("../dirB")
from B import funcB

「../」は上位のディレクトリを指しています。 さらに上位のディレクトリを指定するときは、「../../」のようにします。

 

カレントディレクトリdirCからC03.pyを実行すると以下のように出力されます。

C -- funcC
C -- funcCB : B -- funcB

  

 

まとめ

まとめの画像

今回は、pythonのインポートエラーの解決方法について紹介しました。

 

解決方法

1.カレントディレクトリにインポートしたいファイルを持ってくる。

2.上位のディレクトリから実行する。

3.「sys.path」に対象のディレクトリを追加する。

 

個人的には、3番目の解決方法が一番簡単であると思います。

 

今回紹介した方法で解決できなかった場合、メールにてエラーの状況(ディレクトリ・ファイル関係、コード)を送っていただければ、調査いたします。

 

 

最後までお読みいただきありがとうございます。


スポンサードサーチ