Pythonでは、同階層や下位階層に存在するファイルからモジュールを読み込むことが基本です。しかし、上位階層にあるモジュールを普通に読み込もうとするとエラーになります。この記事では、上位階層のモジュールをインポートする方法について説明します。
エラーの原因
スクリプト自身が存在する階層を、最上位のルート階層としてそれぞれ解釈するという挙動が原因です。つまり、上位階層にあるモジュールをインポートしようとすると、「Attempted relative import beyond top-level package」というエラーが出力されます。
解決方法
方法1: __init__.py
を使用する
各階層がパッケージ化されていれば上位階層でもモジュールを読み込むことができます。階層をパッケージ化するためには、各階層に__init__.py
という名前の空ファイルを置くことで可能です。
方法2: sys.path
を設定する
sys.path
に上位階層の絶対パスを追加することで、上位階層のモジュールをインポートすることができます。
import sys
import pathlib
# ひとつ上の階層の絶対パスを取得
parent_dir = str(pathlib.Path(__file__).parent.parent.resolve())
# モジュール検索パスに,ひとつ上の階層の絶対パスを追加
sys.path.append(parent_dir)
これらの方法を用いることで、Pythonで上位階層のモジュールをインポートすることが可能になります。ただし、モジュールの配置は基本的に同階層か下層にすることが推奨されています。: https://qiita.com/Anaakikutsushit/items/f469e6883ee066c66f49 : https://qiita.com/hacchi_/items/8d9ac9f2f918950663df