Python从子模块中导入子模块

3

我在使用Python的导入时遇到了问题。我编写了一个已完成的模块,它本身使用了几个子模块(这些都是被导入的)。

例如:

module:
   main_class.py
   submodule1.py
   ....

现在我想通过另一个超级模块使用此已完成的模块,因此文件夹结构将会改变,如下所示。
supermodule:
    main_class_super.py     -- this class imports module.main_class
    module:
       main_class.py
       submodule1.py
       ....

然而,现在在模块内部使用的所有导入代码在main_class.py中都失败了(我猜这是因为导入现在在main_class_super.py的命名空间中工作)。

有没有什么办法可以解决这个问题,而不必重新构建整个源代码?


具体的错误信息:

在我的main_class.py中,我使用了以下代码:

import submodule1

在我的supermodule.py文件中,我使用了以下代码行:
import module.main_class

执行导入module.main_class的超类时,当然也会执行import submodule1行,但由于它无法在supermodule.py的命名空间中找到该模块而失败。
1个回答

5
如果您使用的是Python 2,您应该在文件中添加from __future__ import absolute_import(在Python 3中不需要),这样您就可以像Guido在PEP 328中所述那样进行导入。
根据此文档,您应该:
- 确保所有的包文件夹中都有一个__init__.py文件,以便将其标记为可导入的 - 在main_class.py中:用from . import submodule1替换import submodule1import module.submodule1 - 在main_class_super.py中:用from .module import main_class替换import module.main_class 这样,您就不必关心任何外部包结构了。
Python 2.5中添加了使用绝对和显式相对导入的选项。

额,我觉得我不太明白这个怎么能帮助我。鉴于我的文件夹结构,我应该如何在supermodule.py中导入submodule1.py子模块? - WodkaRHR
很抱歉再次打扰您,我遇到了另一个问题。在这些子模块中,有几个模块导入相同的其他模块(例如,子模块1导入子模块2和3,而子模块2也导入子模块3)。然后,在子模块2内部进行的此导入将无法正常工作(即使我将其更改为from . import submodule3)。所有其他导入都可以正常工作。 - WodkaRHR
抱歉,如果没有目录布局(哪些文件在哪些文件夹中?),我无法提供帮助。 - janbrohl
结构是相同的,只是在最低层不仅有submodule1.py,还有submodule2.py和submodule3.py。 - WodkaRHR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接