如何在__init__.py文件中导入当前模块?

时间:2013-12-03 08:49:29

标签: python import module

package
    1) module1
    2) module2
    3) module3
    4) __init__.py

我想做的是

  1. 导入package
  2. 然后我可以直接使用module1module2中的一些子模块,看起来好像我是按照以下方式导入的:

    import module1
    
  3. 如果我使用imp.load_module中的__init__.py加载module1,那么dir(package1)"module1" "module2" sys.modules ,但我仍然需要使用package.modules1来访问它。我注意到,当我导入package时,我将获得一个'module'对象包。如果我更新了软件包的内置方法,它会欺骗系统使module1可见。

    >>> import package
    >>> package.__dict__.update(package.module1.__dict__)
    

    然后一切看起来都很好,似乎py module1已导入import module1,我可以直接使用module1中的类或模块。

    然后提出我的问题---如何检测__init__.py中的当前模块对象?我试过imp.find_module,但它似乎没有返回模块对象。

    好的,我在这里更新了问题。     首先,module1实际上是我想在代码中使用的,但它依赖于module2和module3,而module1,module2和module3都来自opensource代码。为了使其与最新版本保持同步,所以module1,2,3在解压缩后仍然保持原样。     我们需要包装module1来为其他人提供一些接口,他们希望在调用时module1是可见的     “import module1”     但是,因为它依赖于module2,3,所以它不可调用。 所以我想将它包装在一个新的“包”中,或者只是将“包”重命名为“module1”,所以 当其他人调用“import package”时,它会透明地使module1名称空间对调用者可见。     我现在可以使用imp.load_module来加载module1,但是当我调用dir(package)时,它看起来像这样:

     >>> import package
    >>> print dir(package)
        ['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'module1']
    >>> print type(package.modue1)
     type<'module'>
    

    因此,调用者仍然无法直接看到module1。 我注意到如果我使用这样的棘手方法,我可以更新模块的属性和成员函数:

    >>> import package (this will triger calling __init__.py)
    >>> package.__dict__.update(package.module1.__dict__)
    

    在此之后,如果我刚刚调用“import module1”,一切看起来都像。但是,在“import”返回后我无法获取模块对象,我想知道是否有任何方法可以在 init .py中上传模块dict?

1 个答案:

答案 0 :(得分:1)

你为什么要这样做?明确比隐含更好!

导入您希望在__init__中展示的所有API,然后让人们使用from package import *。使用__all__明确列出应该以这种方式导出的内容。

__init__.py中,使用:

import module1
import module2

__all__ = ['module1', 'module2']

并将所有内容导入您的用户。 他们应该有选择,而不是强迫模块。

或者,如果您想要 中的项目package中可以看到嵌套模块,请明确导入,或者也可以使用from modulename import *(但请添加{{} 1}}列出这些模块):

__all__

from module1 import * from module1 import __all__ as module1_exported from module2 import * from module2 import __all__ as module2_exported __all__ = module1_exported + module2_exported 添加项目意味着您可以将名称显示为无处不在,而不仅仅是导入__builtins__的内容。很少需要搞乱内置插件。