子模块导入主模块
首先,我很抱歉如果这个问题已经在其他地方问过了。我真的找过它,但没有找到任何东西。子模块导入主模块
情况如下: 在文件夹mod
中,我有文件__init__.py
和sub.py
。做import mod.sub
,为什么mod/__init__.py
再次执行时
>>> import mod
mod
>>> import mod.sub
mod
sub
但是: 它们包含以下数据: __init__.py
:
print "mod"
sub.py
:
import __init__
print "sub"
现在让我们做以下?它已经被导入。 如果我们只是调用同一个奇怪的特性存在:
>>> import mod.sub
mod
mod
sub
我可以改变通过改变import __init__
的行为?这是对我来说很可能是错误的一条线。
更换
import __init__
实际上,你可以检查一下使用字典sys.modules
回事。 Python决定根据该字典中的键重新加载模块。
当您运行import mod
时,它将在sys.modules
中创建一个条目mod
。
当您运行import mod.sub
,调用import __init__
后,Python的检查重点mod.__init__
是否sys.modules
,但没有这样的关键,因此它再次导入。
底线是Python决定通过sys.modules
中存在的键重新导入模块,而不是因为实际的模块已经被导入。
很好的解释,谢谢。 – Turion
为了完整起见,我找到了另一种解决方案,相对进口玩弄:
通过
from . import __init__
更换
import __init__
但我不明白为什么这个工程。
编辑:这实际上不起作用。由此产生的__init__
不是模块mod
,而是method-wrapper
类型的其他类型。现在我完全困惑。
为什么在sub.py中输入“__init__”? – rocksportrocker
由于主模块mod包含在sub中被分类的共享类。 – Turion