我意識到在StackOverflow已經有很多關於這個的問題,但我發現解決方案完全不清楚,並且經常相互矛盾。Python3在包內的相對導入
我有以下情形:我正在寫一個Python(Python的3.4)封裝結構如下:
mypackage/
__init__.py (empty file)
mydir1/
__init__.py (empty file)
mymodule1.py
mydir2/
__init__.py (empty file)
mymodule21.py
mymodule22.py
mydir3/
__init__.py (empty file)
mymodule31.py
mymodule32.py
tests/
__init__.py (empty file)
test_something_in_mydir1.py
test_something_in_mydir2.py
test_something_in_mydir3.py
我想tests/
目錄中的文件包含在包裝內的一切的單元測試。問題是,不管哪一種方法我試試,我得到這個錯誤:
SystemError: Parent module '' not loaded, cannot perform relative import
我要指出,我想這個工作「開箱即用」,這意味着我不希望導入的東西使用他們的絕對路徑,我不想改變我的路徑變量。這些解決方案似乎都不是什麼pythonic,它讓我慢慢地爬上了牆。是否真的沒有辦法做到這一點?
我已經嘗試了一堆東西已經包括下面的例子,但他們似乎都產生相同的結果:
from ..mydir1.mymodule1 import *
from .mypackage.mydir1.mymodule1 import *
from ...mypackage.mydir1.mymodule1 import *
我累了,在每個__init__.py
文件覆蓋__all__
變量以及進口如下所示:https://docs.python.org/3/reference/import.html#submodules
任何人都可以告訴我如何在文件test_something_in_mydir1.py
中構造導入(例如),以便有權訪問所有找到的類/函數用於單元測試包的mymodule1.py?
沒關係,我有一個命名錯誤,所以現在它發現了測試並嘗試運行它,但儘管使用了相對導入'from ..mydir1.mymodule1 import *'它仍然給我錯誤SystemError:父模塊''沒有加載,不能執行相對導入' – RedHack
我也試過'從..mydir1導入mymodule1',那也沒有工作,產生相同的錯誤。 – RedHack
我確信在我的具體情況下它不是什麼愚蠢的東西,甚至重新創建了與我在這裏使用的佔位符相同的標題的目錄,並確實發生了同樣的問題。我創建了一個pastebin,以防萬一它能幫助我查看我使用的精確命令以及我得到的錯誤(http://pastebin.com/08mutDrY) – RedHack