2011-09-21 153 views
5

首先,我很抱歉如果这个问题已经在其他地方问过了。我真的找过它,但没有找到任何东西。子模块导入主模块

情况如下: 在文件夹mod中,我有文件__init__.pysub.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__的行为?这是对我来说很可能是错误的一条线。

+0

为什么在sub.py中输入“__init__”? – rocksportrocker

+0

由于主模块mod包含在sub中被分类的共享类。 – Turion

回答

1

你应该

import mod 
+0

我觉得这很有效。毕竟,我们已经在'mod'文件夹中,并且我会认为解释器会寻找一个'mod.py'文件。 – Turion

7

更换

import __init__ 

实际上,你可以检查一下使用字典sys.modules回事。 Python决定根据该字典中的键重新加载模块。

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

当您运行import mod.sub,调用import __init__后,Python的检查重点mod.__init__是否sys.modules,但没有这样的关键,因此它再次导入。

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

+0

很好的解释,谢谢。 – Turion

0

为了完整起见,我找到了另一种解决方案,相对进口玩弄:

通过

from . import __init__ 

更换

import __init__ 

但我不明白为什么这个工程。

编辑:这实际上不起作用。由此产生的__init__不是模块mod,而是method-wrapper类型的其他类型。现在我完全困惑。