2012-07-28 23 views
8

我想了解一个加载的模块与导入的模块之间的区别,如果有的话。Python sys.modules包含一个尚未导入的模块

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

如果我执行:

import sys 
sys.modules 

我得到一个名单,其中包括os,例如。该文档说sys.modules是“已加载”模块的列表。但是,如果我尝试运行诸如os.environ之类的东西,则会得到一个NameError,它告诉我os未定义。但是,如果我运行import os,则可以解决此问题。任何人都可以解释为什么os存在于sys.modules实际导入模块之前?

+0

打开一个全新的外壳,并通过步骤。发布说明或更好的屏幕截图。模块os不驻留在sys中。 – 2012-07-28 02:27:10

回答

9

正在导入和正在加载的模块之间的区别是放入当前模块的名称空间中。一个模块只能加载一次(在一般情况下),但可以从许多不同的地方多次导入。如果已加载的模块尚未导入,那么在给定的名称空间中可能无法访问该模块。例如,您可以使用from module import name语法加载模块而不用名称导入它(您可以访问指定的名称,但不能访问模块本身)。

您看到sys.modules字典中的os模块,因为它由Python解释器在内部使用,因此它始终在启动时加载。尽管你不能使用名字“os”来访问它,因为它不会自动导入你的名字空间。

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

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

现在,您就可以访问os模块就好像你做了import os

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

+0

谢谢,这帮了很大的忙! – Justin 2012-07-28 09:02:23