标题可能很难理解,但我会尽力解释。
我有一个名为SubModule
的文件夹,其中包含3个文件:
__init__.py
Class1.py
Class2.py
在__init__.py
内,我得到了这个:
import Class1
import Class2
def main():
c1 = Class1.Class1()
c2 = Class2.Class2()
if __name__ == "__main__":
main()
一切正常,没有错误,我可以正确使用c1和c2。
当我尝试将SubModule
文件夹移到另一个模块(我们称之为MainModule
)文件夹下时,会出现问题。
所以我会有以下内容:
MainModule\__init__.py
MainModule\SubModule\__init__.py
MainModule\SubModule\Class1.py
MainModule\SubModule\Class2.py
现在,当我尝试从SubModule
导入MainModule\__init__.py
时,就像这样:
import SubModule
c1 = SubModule.ClassOne.ClassOne()
c2 = SubModule.ClassTwo.ClassTwo()
我希望这会奏效。
但是,运行MainModule\__init__.py
会引发SubModule\__init__.py
的错误:
Traceback (most recent call last):
File "C:\...\MainModule\__init__.py", line 1, in <module>
import SubModule
File "C:\...\MainModule\SubModule\__init__.py", line 1, in <module>
import Class1
ImportError: No module named 'Class1'
正如您所看到的,错误来自import Class1
,它告诉我有No module named 'Class1'
。
这是因为路径现在是SubModule.Class1
,而不仅仅是Class1
。
我可以通过将SubModule\__init__.py
更改为此来消除此错误:
import SubModule.Class1
import SubModule.Class2
但是,我无法再通过SubModule
单独使用SubModule\__init__.py
,因为路径将再次import Class1
,而不是import SubModule.Class1
。
这让我很疯狂,有没有办法概括导入,所以哪个模块导入SubModule无关紧要?
答案 0 :(得分:1)
有一种方式,不完全是&#39;一般&#39;,但......
try:
import Submodule.Class1 as Class1
except ImportError:
import Class1
答案 1 :(得分:0)
您应该始终从系统路径绝对导入模块。因此,如果您的包MainModule包含子包SubModule,您应该from MainModule import SubModule
(或from . import SubModule
)。另外,在SubModule中,执行from . import Class1
。无论SubModule
的路径如何,都应该让它工作。 (但是,如果以两种不同的方式导入SubModule
,它仍会导致奇怪 - 包括将其作为主文件运行而不是导入它。)