>>> import sys
>>> del sys.modules['sys']
>>> import sys
>>> sys.modules
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'sys' has no attribute 'modules'
为什么重新导入的
sys
模块不再有一些属性了?
我使用的是 Python 3.12.3,它发生在 macOS、Linux 和 Windows 中。它发生在 REPL 和 .py 脚本中。在 Python 3.11 中不会发生这种情况。
sys
模块无法像普通内置模块一样初始化,因为它负责许多特殊功能。相反,在解释器启动时,Python 使用特殊函数 sys
创建
_PySys_Create
模块。此函数负责(部分工作)正确设置 sys
模块,包括 sys.modules
属性:
if (PyDict_SetItemString(sysdict, "modules", modules) < 0) {
goto error;
}
当您执行
del sys.modules['sys']
时,导入系统将失去对 sys
模块的跟踪。当您尝试再次导入它时,Python 会尝试创建一个全新的 sys
模块,并且这样做就像 sys
是普通的内置模块一样。它完成了初始化普通内置模块的过程。此过程使新的 sys
模块处于不一致、不正确的初始化状态,因为 sys
从未设计为以这种方式初始化。