Python中的相對導入是指在一個包中從其他模塊中導入相對路徑下的模塊。這種方式可使代碼更加簡潔和易于維護,但如果使用不當,會導致導入失敗的問題。
假設有如下包結構:
. ├── my_package │ ├── module1.py │ ├── module2.py │ ├── sub_package │ │ ├── __init__.py │ │ └── module3.py │ └── __init__.py └── main.py
現在我們在module1.py中嘗試導入module3.py:
# module1.py from .sub_package.module3 import some_function some_function()
這是典型的相對導入方式,其中“.”表示當前包。如果我們在main.py中從my_package中導入module1.py:
# main.py from my_package import module1 module1.some_function()
在終端中運行main.py程序輸出如下錯誤信息:
Traceback (most recent call last): File "main.py", line 1, infrom my_package import module1 File "/path/to/project/my_package/module1.py", line 1, in from .sub_package.module3 import some_function ImportError: attempted relative import with no known parent package
從錯誤信息可以看出,Python認為module1.py沒有任何父級包。這是因為我們在命令行中執行main.py,Python無法獲得my_package包的上下文。
解決方法一是修改代碼,使用絕對路徑導入module3.py:
# module1.py from my_package.sub_package.module3 import some_function some_function()
該方式不會受到上下文的影響,但包結構變化時需要手動修改代碼。
解決方法二是使用正確的方式執行main.py。建議使用Python的虛擬環境,從項目根目錄進入虛擬環境再執行main.py:
$ cd /path/to/project $ source venv/bin/activate $ python main.py
在虛擬環境中運行main.py時,Python會正確解析相對路徑導入,從而避免了該問題。