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__)
然后一切看起来都很好,并且似乎像
module1
一样将python的import module1
导入了,我可以直接在module1
中使用类或模块。然后出现我的问题---如何检测
__init__.py
中当前的模块对象?我尝试了imp.find_module
,但似乎没有返回模块对象。好的,我在这里更新问题。
首先,module1确实是我想在代码中使用的东西,但是它取决于module2和module3,而module1,module2和module3均来自开源代码。为了使它与最新版本保持同步,因此模块1,2,3保持解压缩后的样子。
我们需要包装module1为其他人提供一些接口,他们期望在调用时module1可见
“导入模块1”
但是,由于它取决于module2,3,因此它不可调用。
因此,我想将其包装在新的“包”中,或者只是将“包”重命名为“ module1”,因此
当其他人调用“导入包”时,它将透明地使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”一样。但是,“导入”返回后我无法获得模块对象,我想知道是否有任何方法可以在init.py中上传模块字典?
最佳答案
为什么要这样做?显式胜于隐式!
导入您的API要在__init__
中公开的所有内容,然后让人们使用from package import *
。使用__all__
明确列出应以这种方式导出的内容。
在__init__.py
中,使用:
import module1
import module2
__all__ = ['module1', 'module2']
并将所有内容导入您的用户。他们应该选择,而不要强加任何模块。
或者,如果您要使嵌套模块中的项目在
package
中可见,请显式导入这些项目,或在那里也使用from modulename import *
(但请向此类模块添加__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__
中添加项目意味着您可以在任何地方看到名称,而不仅仅是在package
中导入的名称。很少有需要弄乱内置函数的。关于python - 如何使当前模块导入__init__.py文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20346514/