package
1) module1
2) module2
3) module3
4) __init__.py
我想做的是
package
然后我可以直接使用module1
,module2
中的一些子模块,看起来好像我是按照以下方式导入的:
import module1
如果我使用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?
答案 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__
的内容。很少需要搞乱内置插件。