1

标题可能很难理解,但我会尽力解释。

我有一个名为的文件夹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

现在,当我尝试像这样导入SubModuleMainModule\__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 并不重要?

4

2 回答 2

1

有一种方法,不完全是“一般”,但是......

try:
    import Submodule.Class1 as Class1
except ImportError:
    import Class1
于 2012-12-01T20:25:10.267 回答
0

您应该始终从系统路径绝对导入模块。所以如果你的包 MainModule 包含一个子包 SubModule,你应该做from MainModule import SubModule(或from . import SubModule)。此外,在 SubModule 中,执行from . import Class1. 无论路径如何,这都应该让它工作SubModule。(但是,如果您SubModule以两种不同的方式导入它仍然会导致奇怪 - 包括将其作为主文件运行与导入它。)

于 2012-12-01T20:53:11.270 回答