首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子模块导入主模块

子模块导入主模块
EN

Stack Overflow用户
提问于 2011-09-22 01:05:31
回答 3查看 1.4K关注 0票数 5

首先,如果这个问题已经在其他地方被问到了,我很抱歉。我真的找了很久,但什么也没找到。

情况如下:在文件夹mod中,我有文件__init__.pysub.py。它们包含以下数据:__init__.py

代码语言:javascript
复制
print "mod"

sub.py

代码语言:javascript
复制
import __init__
print "sub"

现在让我们执行以下操作:

代码语言:javascript
复制
>>> import mod
mod
>>> import mod.sub
mod
sub

但是在执行import mod.sub时,为什么要再次执行mod/__init__.py呢?它已经被导入。同样奇怪的特性也存在,如果我们只调用:

代码语言:javascript
复制
>>> import mod.sub
mod
mod
sub

我可以通过更改import __init__来更改行为吗?在我看来,这条线最有可能是错的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-22 01:28:37

你应该替换掉

代码语言:javascript
复制
import __init__

通过

代码语言:javascript
复制
import mod
票数 1
EN

Stack Overflow用户

发布于 2011-09-22 01:44:15

实际上,您可以使用字典sys.modules检查正在发生的事情。Python根据字典中的键决定重新加载模块。

当您运行import mod时,它会在sys.modules中创建一个条目mod

当您运行import mod.sub时,在调用import __init__之后,Python会检查密钥mod.__init__是否在sys.modules中,但是没有这样的密钥,所以会重新导入它。

归根结底,Python决定通过sys.modules中的键重新导入模块,而不是因为实际的模块已经导入。

票数 7
EN

Stack Overflow用户

发布于 2011-09-22 02:20:42

为了完整性,我找到了另一个使用相对导入的解决方案:

替换

代码语言:javascript
复制
import __init__

通过

代码语言:javascript
复制
from . import __init__

但我不明白为什么这是可行的。

编辑:这实际上不起作用。生成的__init__不是模块mod,而是method-wrapper类型的其他内容。现在我完全糊涂了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7503748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档