package
1) module1
2) module2
3) module3
4) __init__.py
我想做的是
-
import
package
-
然后我可以直接使用
module1
,module2
中的一些子模块,看起来好像我是按照以下方式导入的:
import module1
如果我在 __init__.py
中使用 imp.load_module
来加载 module1
,那么 dir(package1)
将在 sys.modules
中有 "module1"
, "module2"
,但我仍然需要使用 package.modules1
来访问它 . 我注意到当我导入 package
时,我会得到一个 'module'
对象包 . 如果我更新包的内置方法,它将欺骗系统使 module1
可见 .
>>> import package
>>> package.__dict__.update(package.module1.__dict__)
然后一切看起来很好,似乎python module1
已导入像 import module1
,我可以直接使用 module1
中的类或模块 .
然后提出我的问题---如何检测 __init__.py
中的当前模块对象?我试过 imp.find_module
,但似乎它没有返回模块对象 .
OK , I update the problem here. 首先,module1实际上是我想在代码中使用的,但它依赖于module2和module3,而module1,module2和module3都来自opensource代码 . 为了使其与最新版本保持同步,因此module1,2,3在解压缩后仍然保持原样 . 我们需要包装module1来为其他人提供一些接口,他们希望在调用_1187809时可见module1但是,因为它依赖于module2,3,所以它不可调用 . 所以我想将它包装在一个新的_1187810中,或者只是将"package"重命名为"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 回答
你为什么要这样做?明确比隐含更好!
在
__init__
中导入API要公开的所有内容,然后让人们使用from package import *
. 使用__all__
明确列出应该以这种方式导出的内容 .在
__init__.py
中,使用:并将所有内容导入您的用户 . They should have the choice ,没有强加给他们的模块 .
或者,如果您认为嵌套模块中的项目在
package
中可见,请明确导入它们,或者也使用from modulename import *
(但是要为这些模块添加__all__
列表):将项目添加到
__builtins__
意味着您将名称显示为 everywhere ,而不仅仅是导入package
. 很少需要搞乱内置插件 .