子模块导入主模块
首先,如果这个问题已经在其他地方被问过,我很抱歉。我真的搜索过,但没有找到任何东西。
情况如下: 在文件夹 mod
中,我有文件 __init__.py
和 sub.py
。 它们包含以下数据: __init__.py
:
print "mod"
sub.py
:
import __init__
print "sub"
现在让我们执行以下操作:
>>> import mod
mod
>>> import mod.sub
mod
sub
但是在执行 import mod.sub
时,为什么是 mod/ __init__.py
再次执行?已经进口了。 如果我们只调用:
>>> import mod.sub
mod
mod
sub
我可以通过更改 import __init__ 来更改行为吗?在我看来,这句话最有可能是错误的。
First of all, my apologies if this question has already be asked elsewhere. I really searched for it, but didn't find anything.
The situation is the following:
In a folder mod
, I have the files __init__.py
and sub.py
.
They contain the following data:__init__.py
:
print "mod"
sub.py
:
import __init__
print "sub"
Now let's do the following:
>>> import mod
mod
>>> import mod.sub
mod
sub
But when doing import mod.sub
, why is mod/__init__.py
executed again? It had been imported already.
The same strange feature exists if we just call:
>>> import mod.sub
mod
mod
sub
Can I change the behaviour by changing the import __init__
? This is the line that seems most likely wrong to me.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您实际上可以使用字典 sys.modules 来检查正在发生的情况。 Python 根据字典中的键决定重新加载模块。
当您运行
import mod
时,它会在sys.modules
中创建一个条目mod
。当您运行
import mod.sub
时,在调用import __init__
之后,Python 会检查键mod.__init__
是否在sys 中.modules
,但是没有这个键,所以再次导入。最重要的是,Python 决定通过 sys.modules 中存在的键重新导入模块,而不是因为实际的模块已经导入。
You can actually inspect what is going on by using the dictionary
sys.modules
. Python decides to reload a module depending on the keys in that dictionary.When you run
import mod
, it creates one entry,mod
insys.modules
.When you run
import mod.sub
, after the call toimport __init__
, Python checks whether the keymod.__init__
is insys.modules
, but there is no such key, so it is imported again.The bottom line is that Python decides to re-import a module by keys present in
sys.modules
, not because the actual module had already been imported.你应该替换
为
you should replace
by
为了完整起见,我找到了另一个处理相对导入的解决方案:
替换
为
但我不明白为什么这有效。
编辑:这实际上不起作用。生成的
__init__
不是模块mod
,而是method-wrapper
类型的其他东西。现在我完全困惑了。For completeness, I found another solution playing around with relative imports:
Replace
by
But I don't understand why this works.
edit: This actually doesn't work. the resulting
__init__
is not the modulemod
, but something else of the typemethod-wrapper
. Now I'm totally confused.