Python sys.modules contains a module which is not yet imported(Python sys.MODULES包含尚未导入的模块)
问题描述
我正在尝试了解加载的模块和导入的模块(如果有)之间的区别。
我使用的是Python2.7.3,只是从命令行运行。
如果我执行:
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语句除了将新模块添加到当前命名空间外,还加载新模块。虽然您可以手动加载模块并绕过常规导入系统进行进一步的工作,但很少有好的理由这样做。
这篇关于Python sys.MODULES包含尚未导入的模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Python sys.MODULES包含尚未导入的模块
基础教程推荐
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
