>>> 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中不会发生.

推荐答案

这显然是你不应该做的事情,自然容易弄坏东西.在您try 的Python实现中,它碰巧以这种特殊的方式 destruct 了事情,但Python并不promise 会发生什么.我要说的大部分内容都是实施细节.


sys模块无法像普通内置模块那样进行初始化,因为它负责如此多的核心功能.相反,在解释器启动时,Python会创建带有特殊函数_PySys_Createsys模块.该功能负责(工作的一部分)正确设置sys模块,包括sys.modules属性:

    if (PyDict_SetItemString(sysdict, "modules", modules) < 0) {
        goto error;
    }

当您执行del sys.modules['sys']时,导入系统将失go sys模块的跟踪.当您再次try 导入它时,Python会try 创建一个全新的sys模块,它这样做就好像sys是一个普通的内置模块一样.它会经历初始化普通内置模块的过程.此过程使新的sys模块处于不一致、初始化不当的状态,因为sys从未被设计为以这种方式初始化.

reloading sysis支持,尽管我相信开发团队正在考虑取消这种支持-用例非常模糊,而且我唯一能想到的是过时的.重新初始化的一部分最终会达到旨在重新加载syscode path,该sys从原始初始化早期创建的副本sysright before sys.modules is set中更新其__dict__:

    interp->sysdict_copy = PyDict_Copy(sysdict);
    if (interp->sysdict_copy == NULL) {
        goto error;
    }

    if (PyDict_SetItemString(sysdict, "modules", modules) < 0) {
        goto error;
    }

此副本在早期Python版本上的处理方式不同,因此存在与版本相关的行为差异.

Python相关问答推荐

Python:模块未找到:venv为什么要解决它?

从流程获取定期更新

pandas MultiIndex是SQL复合索引的对应物吗?

只需使用Python在图像中保留 colored颜色 范围区域

零填充2D数组上的Numpy切片

仅使用2种 colored颜色 创建热图

Python:MultiIndex Dataframe到类似json的字典列表

使用Python Great Expectations和python-oracledb

Tkinter -控制调色板的位置

使用plotnine和Python构建地块

Python中的嵌套Ruby哈希

通过Selenium从页面获取所有H2元素

在Python Attrs包中,如何在field_Transformer函数中添加字段?

如何让Flask 中的请求标签发挥作用

更改键盘按钮进入'

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

Flash只从html表单中获取一个值

如何排除prefecture_related中查询集为空的实例?

下三角形掩码与seaborn clustermap bug