1. 程式人生 > >Python如何從相對路徑下import

Python如何從相對路徑下import

例如我們有如下結構的檔案:

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

考慮到compontentlibs是處於同一級別的資料夾,我們可以直接在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