Pythonを実行したときのエラー「ImportError: attempted relative import with no known parent package」の原因と解決方法についてまとめました。
「ImportError: attempted relative 〜」エラーの原因
Pythonを実行したときに以下のエラーが表示されることがあります。
ImportError: attempted relative import with no known parent package
翻訳すると以下のとおりで、カレントディレクトリより上位ディレクトリにあるファイルをインポートしようとた」ことがエラーの原因です。
ImportError: 既知の親パッケージなしで相対インポートを試行しました
例えば、以下のようなディレクトリ構造とファイルの内容であるとします。
dirX ├ dirY │ └ y.py └ dirZ └ z.py
y.py
def func_y(): print("y関数です") if __name__ == '__main__': func_z()
z.py
def func_z(): print("z関数です") if __name__ == '__main__': func_z()
以下のように「z.py」を書き換えて「y.py」をインポートし、カレントディレクトリをdirZとして「z.py」を実行するとインポートエラーになります。
z.py(エラー)
from ..dirY.y import func_y def func_z(): print("z関数です") if __name__ == '__main__': func_z() func_y()
解決方法としては以下のとおりです。
①カレントディレクトリ配下にインポートするファイルを格納
②インポートするファイルより上位のディレクトリでPythonを実行
③「sys.path」に対象のディレクトリを追加
解決方法①カレントディレクトリ配下にインポートするファイルを格納
カレントディレクトリ配下(dirZ)にインポートするファイルを格納することでエラーを解消できます。
前項の例の場合、以下のように「y.py」をdirZ配下に移動し、「z.py」のimport文を修正すると、エラーが解消されます。
dirX ├ dirY │ └ dirZ |- y.py └ z.py
z.py
from y import func_y def func_z(): print("z関数です") if __name__ == '__main__': func_z() func_y()
解決方法②カレントディレクトリ配下にインポートするファイルを格納
「y.py」を移動させたくない場合、上位のディレクトリから実行することでもエラーを解消できます。
dirX ├ dirY │ └ y.py └ dirZ └ z.py
前項の例の場合、以下のように「y.py」をdirZ配下に移動し、「z.py」のimport文を修正し、カレントディレクトリを「dirX」にしてから「z.py」を実行すれば、エラーは解消されます。
z.py
from dirY.y import func_y def func_z(): print("z関数です") if __name__ == '__main__': func_z() func_y()
解決方法③「sys.path」に対象ディレクトリを追加
以下のように、「sys.path.append」メソッドを用いると、カレントディレクトリは「dirZ」のまま、また「y.py」も移動せずにエラーを解消できます。
dirX ├ dirY │ └ y.py └ dirZ └ z.py
z.py
import sys sys.path.append("../dirY") from dirY.y import func_y def func_z(): print("z関数です") if __name__ == '__main__': func_z() func_y()
関連ページ
Pythonの基礎から応用例については以下ページにまとめています。
コメント