今天幫忙學弟妹解決問題才發現從來沒碰過如何隔著一個主資料夾import module。

以往都是盡量不這樣做(避免一些無謂的引用錯誤),但真的需要的時候還真的可以用到。

問題描述

首先有個檔案架構如下:

1
2
3
4
5
.
├── dir1
│   ├── apple.py
└── dir2
    └── banana.py

apple.py檔案中有此敘述:

1
print("I eat apple.")

banana.py中需要引用到apple.py的話,直覺會想到要這樣寫:

1
from ..dir1 import apple

執行後會出現以下錯誤訊息:

1
2
3
4
5
python banana.py
Traceback (most recent call last):
  File "banana.py", line 1, in <module>
    from ..dir1 import apple
ValueError: attempted relative import beyond top-level package

解決

將import修改為這樣

1
2
3
4
5
import sys
sys.path.append('../')
# 或是這樣也行
# sys.path.append('..') 
from dir1 import apple

就能解決了