Python导入:模块的路径是不同的,具体取决于它从哪里导入?

时间:2012-12-01 20:05:06

标签: python import module

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

我有一个名为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无关紧要?

2 个答案:

答案 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,它仍会导致奇怪 - 包括将其作为主文件运行而不是导入它。)