【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番目の解決方法が一番簡単であると思います。
今回紹介した方法で解決できなかった場合、メールにてエラーの状況(ディレクトリ・ファイル関係、コード)を送っていただければ、調査いたします。
最後までお読みいただきありがとうございます。
スポンサードサーチ