Python如何從相對路徑下import
阿新 • • 發佈:2019-02-14
例如我們有如下結構的檔案:
pkg/
__init__.py
libs/
some_lib.py
__init__.py
components/
code.py
__init__.py
如果我們想要在code.py
中呼叫libs/some_lib.py
這個module,比如使用相對呼叫:from ..libs.some_lib import something
,僅僅在package中加上__init__.py
是不夠的。python會返回ValueError: Attempted relative import in non-package
這個錯誤。那麼這個問題如何解決呢?
有以下解決方法:
將當前路徑加入sys.path
考慮到compontent
和libs
是處於同一級別的資料夾,我們可以直接在code.py
中加入如下程式碼來把當前資料夾的母資料夾加入系統路徑。
import sys
from os import path
sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) )
或者如下(這種情況對任何關係的資料夾都適用,只要我們在lib_path
中給出到達該資料夾的絕對路徑):
import os, sys
lib_path = os.path.abspath(os .path.join('..'))
sys.path.append(lib_path)
這樣我們就可以用from libs.some_lib import something
來import了。
以package
模式執行該程式碼:
python -m pkg.components.code
然後我們就可以用from ..libs.some_lib import something
來import了。
注意這裡不需要.py
作為檔案結尾。
總結
我們實際上可以結合這兩種方法:
if __name__ == '__main__':
if __package__ is None:
import sys
from os import path
sys.path.append( <path to the package> )
from libs.some_lib import something
else:
from ..libs.some_lib import something