8

我试图了解加载的模块与导入的模块之间的区别(如果有的话)。

我正在使用 Python 2.7.3,并且只是从命令行运行 Python。

如果我执行:

import sys
sys.modules

例如,我得到一个列表,其中包括os。文档说这sys.modules是“加载”模块的列表。但是,如果我尝试运行类似的东西os.environ,我会得到一个 NameError ,它告诉我os没有定义。但是,如果我然后运行import os,这可以解决问题。谁能解释为什么在我实际导入模块之前os存在?sys.modules

4

1 回答 1

12

导入和加载的模块之间的区别在于放入当前模块的命名空间中的内容。一个模块只会被加载一次(在普通情况下),但可以从许多不同的地方多次导入。如果尚未在给定名称空间中导入已加载的模块,则它可能无法在给定名称空间中访问。例如,您可以使用from module import name语法加载模块而不用其名称导入它(您将能够访问指定的名称,但不能访问模块本身)。

os在字典中看到该模块是sys.modules因为它由 python 解释器在内部使用,因此它总是在启动时加载。但是,您不能使用名称“os”访问它,因为它不会自动导入您的命名空间。

但是,您可以通过几种方式绕过正常的导入机制。例如,试试这个:

import sys
os = sys.modules["os"]

您现在可以像访问该os模块一样访问该模块import os

import这是因为当您请求已加载的模块时,该代码正是语句所做的。但是,如果您使用尚未加载的模块尝试上面的代码,它将无法工作(您将从sys.modules字典中得到一个关键错误)。import除了将新模块添加到当前命名空间之外,该语句还加载新模块。虽然您可以手动加载模块并围绕常规导入系统进一步工作,但很少有这样做的充分理由。

于 2012-07-28T03:14:22.760 回答