問題重現
有下面的代碼:
from ..utils import Config,set_DATA_PATH
DATA_PATH = set_DATA_PATH()
報錯如下:
from ..utils import Config,set_DATA_PATH
ImportError: attempted relative import beyond top-level package
解決方案
#獲取當前腳本所在目錄的父目錄(項目根目錄)
import sys
import os
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if project_root not in sys.path:sys.path.insert(0, project_root)
from utils import Config, set_DATA_PATH
文件結構:
project 3- utils- directory 2- file(被運行的文件) 1
這個解決方案通過以下方式解決問題:
-
確定項目根目錄:
file 獲取當前腳本的絕對路徑 1
os.path.abspath() 確保路徑是絕對路徑
os.path.dirname() 兩次獲取父目錄的父目錄(項目根目錄) 1->2->3
-
修改Python路徑:
sys.path 是Python解釋器查找模塊的路徑列表
sys.path.insert(0, project_root) 將項目根目錄添加到路徑列表的開頭
這樣Python會在項目根目錄中查找模塊,使絕對導入成為可能
-
效果:
解決了相對導入的限制
允許使用絕對導入(如from utils import Config, set_DATA_PATH)
無論腳本如何運行(直接運行或作為模塊導入),都能正常工作