如果我创建一个包含以下内容的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'>


我未指定要导入的模块为何显示为已导入?

最佳答案

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

因此,如果将模块加载到您代码访问的任何模块或库中的任何位置,则此后它将保留在sys.modules中。

因此,在您的主要例程中,当您说:

import sys
from test_folder import constant1


它正在加载您的__init__以访问constant1,但是由于__init__代码也导入了moduleVar1,因此python会在sys.modules中创建一个条目作为记录保持条目,即使它没有导入到您的计算机中也是如此。主模块,因此如果打印出sys.modules,您将看到剩余条目。

关于python - 访问导入到__init__的模块而无需直接引用它们,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34704132/

10-12 14:27
查看更多