我试图了解加载的模块与导入的模块之间的区别(如果有的话)。
我正在使用 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
语法(您将能够访问指定的名称,但不能访问模块本身)。
你正在看到os
模块中的sys.modules
字典,因为它由 python 解释器内部使用,所以它总是在启动时加载。但您无法使用名称“os”访问它,因为它不会自动导入到您的命名空间中。
但是,您可以通过几种方式绕过正常的导入机制。例如,试试这个:
import sys
os = sys.modules["os"]
您现在可以访问os
模块就像你已经完成的一样import os
.
那是因为该代码正是import
当您请求已加载的模块时,语句会执行此操作。但是,如果您使用尚未加载的模块尝试上面的代码,它将无法工作(您将从sys.modules
字典)。这import
语句除了将新模块添加到当前命名空间之外还加载它们。虽然您可以手动加载模块并进一步解决常规导入系统的问题,但很少有充分的理由这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)