我正在努力理解加载的模块与导入的模块之间的区别(如果有的话)。
我使用的是Python 2.7.3,只是从命令行运行Python。
如果我执行:
import sys
sys.modules
例如,我得到一个包含os
的列表。文档中说sys.modules
是一个"已加载"模块的列表。然而,如果我尝试运行类似os.environ
的东西,我会得到一个NameError,它告诉我os
没有定义。但是,如果我运行import os
,这就解决了问题。在我实际导入模块之前,有人能解释为什么os
存在于sys.modules
中吗?
导入模块和加载模块之间的区别在于放置在当前模块的命名空间中的内容。一个模块只能加载一次(在普通情况下),但可以从许多不同的地方导入多次。加载的模块可能无法在给定的命名空间中访问,如果它还没有导入到那里的话。例如,您可以加载模块,而无需使用from module import name
语法以其名称导入模块(您可以访问指定的名称,但不能访问模块本身)。
您在sys.modules
字典中看到os
模块,因为它是由python解释器内部使用的,所以它总是在启动时加载。但是,您不能使用名称"os"访问它,因为它不会自动导入到您的命名空间中。
但是,您可以通过几种方式绕过正常的导入机制。例如,试试这个:
import sys
os = sys.modules["os"]
现在,您将能够访问os
模块,就像您完成了import os
一样。
这是因为当您请求已经加载的模块时,该代码正是import
语句所做的。但是,如果您使用尚未加载的模块尝试上面的代码,它将不起作用(您将从sys.modules
字典中得到一个关键错误)。import
语句除了将新模块添加到当前命名空间之外,还加载这些模块。虽然您可以手动加载模块并围绕常规导入系统进行进一步的工作,但很少有充分的理由这样做