访问导入__init__的模块而不直接引用它们

时间:2016-01-10 09:57:19

标签: python python-2.7 python-3.x

如果我制作一个test_folder.__init__,其中包含:

constant1 = 1
from test_folder import moduleVar1

然后从父目录运行以下脚本:

import sys
from test_folder import constant1
print(constant1)
print(sys.modules)

sys.modules告诉我test_folder.moduleVar1已导入。

sys.modules的输出:

'test_folder.moduleVar1': <module 'test_folder.moduleVar1' from 'C:...\test_folder\moduleVar1.py'>

为什么当我还没有指定导入时,此模块会显示为导入?

1 个答案:

答案 0 :(得分:2)

你所看到的看起来是正确的。您不能只导入一个变量。将导入整个__init__模块以及其他导入。请注意,sys.modules并不表示某些内容已导入当前名称空间,并且与当前名称空间无关。本质上,sys.modules是一个全局字典(或缓存),Python使用它来确保如果您多次导入模块或引用其子模块,它不必重新加载模块,并且它不会从两个不同的地方加载相同的模块。

因此,如果在您的代码访问的任何模块或库中 中加载了一个模块,那么它将保留在sys.modules之后。

所以,在你的主要例程中,当你说:

import sys
from test_folder import constant1

正在加载__init__以访问constant1,但由于__init__代码也会导入moduleVar1,因此python会在sys.modules中输入一个条目作为记录保留条目,即使它未导入主模块,因此如果您打印出sys.modules,您将看到剩余条目。