我试图了解加载模块与导入模块之间的区别,如果有的话.
我正在使用Python 2.7.3,我只是从命令行运行Python.
如果我执行:
import sys
sys.modules
Run Code Online (Sandbox Code Playgroud)
我得到一个列表,其中包括os,例如.文档说这sys.modules是"已加载"模块的列表.但是,如果我尝试运行类似的东西os.environ,我会得到一个NameError,告诉我os没有定义.但是,如果我然后运行import os,这将解决问题.谁能解释为什么os在sys.modules我实际导入模块之前存在?
Blc*_*ght 10
导入和加载的模块之间的区别在于当前模块的命名空间.模块只能加载一次(在普通情况下),但可以从许多不同的地方多次导入.如果尚未在其中导入已加载的模块,则可能无法在给定的命名空间中访问该模块.例如,您可以使用from module import name语法加载模块而不在其名称下导入模块(您将能够访问指定的名称,但不能访问模块本身).
你os在sys.modules字典中看到了这个模块,因为它是由python解释器在内部使用的,所以它总是在启动时加载.但是,您无法使用名称"os"访问它,因为它不会自动导入您的命名空间.
但是,您可以通过几种方式绕过正常的导入机制.例如,试试这个:
import sys
os = sys.modules["os"]
Run Code Online (Sandbox Code Playgroud)
您现在可以os像访问过一样访问模块import os.
这是因为import当您请求已经加载的模块时,该代码正是语句所执行的操作.但是,如果您使用尚未加载的模块尝试上面的代码,它将无法工作(您将从sys.modules字典中获得密钥错误).import除了将新模块添加到当前命名空间之外,该语句还会加载新模块.虽然您可以手动加载模块并进一步解决常规导入系统,但很少有理由这样做.
| 归档时间: |
|
| 查看次数: |
2387 次 |
| 最近记录: |