Python 换出 sys.modules 并不像直觉那样工作

2023-12-28

我正在尝试设置字典sys.modules在寻找答案时另一个问题 https://stackoverflow.com/q/42134260/2988730并发现了一些有趣的事情。链接的问题涉及消除导入模块的所有影响。基于另一个帖子 https://stackoverflow.com/a/487718/2988730,我想出了删除所有新模块的想法sys.modules导入后。我最初的实现是执行以下操作(使用numpy作为要加载和卸载的模块):

# Load the module
import sys
mod_copy = sys.modules.copy()
print('numpy' in mod_copy, 'numpy' in sys.modules) # False False
import numpy
print('numpy' in mod_copy, 'numpy' in sys.modules) # False True
print(id(numpy)) # 45138472

打印输出显示 numpy 已成功导入,并且浅拷贝不包含它,正如预期的那样。

现在我的想法是通过交换来卸载模块mod_copy回到sys.modules,然后删除对该模块的本地引用。理论上,这应该删除所有对它的引用(并且可能确实如此):

sys.modules = mod_copy
del numpy
print('numpy' in sys.modules) # False

这应该足以重新导入模块,但是当我这样做时

import numpy
print('numpy' in sys.modules) # False
print(id(numpy)) # 45138472

看来 numpy 模块没有重新加载,因为它具有相同的id像之前一样。它没有出现在sys.modules,尽管事实上import语句不会引发任何错误并且似乎已成功完成(即numpy模块存在于本地命名空间中)。

另一方面,我在我的答案 https://stackoverflow.com/a/42139290/2988730链接的问题似乎确实工作正常。它直接修改字典而不是交换它:

import sys
mod_copy = sys.modules.copy()
print('numpy' in mod_copy, 'numpy' in sys.modules) # False False
import numpy
print('numpy' in mod_copy, 'numpy' in sys.modules) # False True
print(id(numpy)) # 35963432

for m in list(sys.modules):
    if m not in mod_copy:
        del sys.modules[m]
del numpy
print('numpy' in sys.modules) # False

import numpy
print('numpy' in sys.modules) # True
print(id(numpy)) # (54941000 != 35963432)

我在 Anaconda 安装上使用 Python 3.5.2。我最感兴趣的是针对 Python 3 的解释,但我对 Python 2.7+ 也很好奇。

我唯一能想到的就是这里发生的事情sys维护另一个引用sys.modules并使用该内部参考,无论我对公共参考做了什么。我不确定这是否涵盖了所有内容,所以我想知道到底发生了什么。


即使在 Python 3.5 中,导入实现的一部分是仍然是用C写的 https://hg.python.org/cpython/file/3.5/Python/import.c,该部分使用PyThreadState_GET()->interp->modules检索模块缓存,而不是通过sys.modules属性。您的进口正在发现numpy在旧的sys.modules通过这些代码路径之一。

sys.modules不是为了被替换而设计的。这docs https://docs.python.org/3/library/sys.html#sys.modules提到替换它可能会出现意想不到的行为:

可以操纵它来强制重新加载模块和其他技巧。然而,替换字典不一定能按预期工作从字典中删除必要的项目可能会导致Python失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 换出 sys.modules 并不像直觉那样工作 的相关文章

  • 使用 pyppeteer 与 asyncio 关联来抓取内容

    我用 python 结合编写了一个脚本pyppeteer随着asyncio从其登陆页面抓取不同帖子的链接 并最终通过跟踪通向其内页的 url 来获取每个帖子的标题 我这里解析的内容不是动态的 但是 我利用了pyppeteer and asy
  • 用于读取类似 CSV 行的 Python 正则表达式

    我想解析传入的类似 CSV 的数据行 值用逗号分隔 逗号周围可能有前导和尾随空格 并且可以用 或 引用 例如 这是有效的行 data1 data2 data3 data4 data5 但这是格式错误的 data1 data2 da ta3
  • TemplateSyntaxError:“settings_tags”不是有效的标签库

    当我尝试运行此测试用例时 出现此错误 这是在我的 django 应用程序的tests py 中编写的 def test accounts register self self url http royalflag com pk accoun
  • 如何使用 Pycharm 运行 fast-api 服务器?

    我有一个简单的 API 函数 如下所示 from fastapi import FastAPI app FastAPI app get async def read root return Hello World 我正在使用启动服务器uvi
  • 如何进行重定向并保留查询字符串?

    我想进行重定向并保留查询字符串 就像是self redirect加上发送的查询参数 那可能吗 newurl my new route urllib urlencode self request params self redirect ne
  • 在 ubuntu 中卸载 python 模块

    我必须删除一个名为 django 的 python 模块 一种流行的模块 因为我安装了错误的版本 1 3 py 2 6 中的 beta 如何卸载这个模块 请解释一下 因为我只在 Windows 中使用过 python 而从未在 Ubuntu
  • 将 numpy 数组及其大小写入二进制文件

    我需要将 2D numpy 数组写入文件 包括其尺寸 以便我可以从 C 程序中读取它并创建相应的数组 我编写了一些简单的代码来保存数组 并且可以从 C 读取它 但是如果我尝试先写入数组的大小 它总是会给我一个错误 这是我的简单 python
  • 使用 Poetry 创建的 Python 项目:如何在 Visual Studio Code 中调试它?

    我有一个根据基本 Poetry 创建的 Python 项目指示 https python poetry org docs basic usage 项目文件夹是这样的 my project my project my project py F
  • 如何同时有效地运行多个 Pytorch 进程/模型? Traceback:分页文件太小,无法完成此操作

    背景 我有一个非常小的网络 我想用不同的随机种子进行测试 该网络几乎只使用了我的 GPU 计算能力的 1 因此理论上我可以同时运行 50 个进程来同时尝试许多不同的种子 Problem 不幸的是我什至无法在多个进程中导入 pytorch 当
  • python win32com.client 调整窗口大小

    我正在使用 Python 3 4 1 通过 win32com client 控制 Windows 应用程序 我可以激活它 我可以发送击键 点击等 现在我想知道是否有办法调整窗口大小并将其设置到特定位置 我找不到方法 这里有一些代码片段 所以
  • Python SQLite3 SQL注入漏洞代码

    我知道下面的代码片段由于 format 的原因很容易受到 SQL 注入的攻击 但我不知道为什么 有谁明白为什么这段代码容易受到攻击以及我从哪里开始修复它 我知道这些代码片段使输入字段保持打开状态 以便通过 SQL 注入执行其他恶意命令 但不
  • 如何使用 Python 在表单中选择选项?

    我想知道如何以格式如下的形式选择选项 td align left td
  • 使用 Popen 打开进程并获取 PID

    我正在开发一个漂亮的小功能 def startProcess name path Starts a process in the background and writes a PID file returns integer pid Ch
  • 在添加数据之前使用 Python gdata 清除工作表中的行

    我有一个 Google 电子表格 我使用 python 脚本和 gdata 库填充值 如果我多次运行脚本 它会将新行附加到工作表中 我希望脚本在填充之前首先清除行中的所有数据 这样每次运行时我都会有一组新的数据脚本 我尝试过使用 Updat
  • 配置 Django 和 Google 云存储?

    I am not使用应用引擎 我有一个在虚拟机上运行的普通 Django 应用程序 我想使用 Google Cloud Storage 来提供静态文件 以及上传 提供媒体文件 我有一个水桶 如何将 Django 应用程序链接到我的存储桶 我
  • Python:如何“杀死”类实例/对象?

    我希望 Roach 类在达到一定量的 饥饿 时 死亡 但我不知道如何删除该实例 我的术语可能有误 但我的意思是 窗户上有大量 蟑螂 我希望特定的蟑螂完全消失 我会向您展示代码 但它很长 我将蟑螂类添加到策划者类蟑螂种群列表中 一般来说 每个
  • 我应该在哪里对对象和字段进行 django 验证?

    我正在创建一个 Django 应用程序 它使用 Django Rest Framework 和普通的 django views 作为用户的入口点 我想对模型的独立字段以及整个对象进行验证 例如 字段 根据正则表达式函数输入的车牌是否正确 与
  • 如何使用 QAbstractTableModel(模型/视图)将数据设置到 QComboBox?

    我希望能够设置itemData of a combobox当使用填充时QAbstractTableModel 但是 我只能从模型返回一个字符串data method 通常 当不使用模型时 可以像这样执行 Set text and data
  • 从 HDF5 文件中删除信息

    我意识到 SO 用户以前曾问过这个问题question https stackoverflow com questions 1124994 removing data from a hdf5 file rq 1但它是在 2009 年被问到的
  • nltk 标记化和缩写

    我用 nltk 对文本进行标记 只是将句子输入到 wordpunct tokenizer 中 这会拆分缩写 例如 don t 到 don t 但我想将它们保留为一个单词 我正在改进我的方法 以实现更精确的文本标记化 因此我需要更深入地研究

随机推荐

  • 使用 setRequestedConfiguration 后,不会调用 onConfigurationChanged

    我已经设置了活动来处理配置更改并且它有效 这意味着onConfigurationChanged 当方向改变时被调用 该活动有一个按钮可以显式更改方向 点击后 它调用了setRequestedOrientation ActivityInfo
  • React + webpack:“process.env”未定义

    我正在尝试使用 webpack 在我们的网站上运行热开发服务器 该网站使用 ReactJS 其中包含以下代码 if production process env NODE ENV etc 当不运行热插拔时 它没问题 但使用热插拔时 它会运行
  • 文件字段 - 追加文件列表

    我创建了一个简单的文件字段
  • 为什么 matplotlib 标签“fontsize”不起作用?

    我使用了以下函数 但标签尺寸没有改变 axe set xlabel R 1 m nm 1 axe xaxis label set size 18 axe set ylabel E f l z eV nm fontsize 40 axd se
  • 在 mac 包中嵌入字体

    我有一个正在编写的程序 我想使用一种漂亮的字体 我可以将我的字体嵌入到我的包中并从那里使用它吗 我的代码 NSMutableAttributedString recOf recOf NSMutableAttributedString all
  • 从存储库中的现有 YML 文件创建新管道(Azure Pipelines)

    通常 我通过 Azure DevOps 门户创建新的构建管道 然后 编辑将引导我完成选择项目源 存储库和模板的步骤 之后 我可以选择创建新分支或直接提交到主分支 然而 这一次 我有一个现有的azure pipelines yml文件在我的分
  • 寻求帮助“@property(非空)”它是什么? [复制]

    这个问题在这里已经有答案了 property nonnull Does nonnulliOS8 3中添加了它 它能做什么 是的 它是在 XCode 6 3 中添加的 得到这个信息来自这里 nshipster http nshipster c
  • 正确使用PropertyChangedTrigger和ChangePropertyAction

    我正在尝试设置默认选定值ItemsSource我的财产变化ComboBox 我的xaml
  • onServiceConnected 在bindService 方法之后从未调用

    我有一个特殊情况 由广播接收器启动的服务启动一个活动 我想让此活动能够与服务进行通信 我选择使用 AIDL 来使其成为可能 一切似乎都很好 除了bindService 调用的方法onCreate 的活动 实际上 bindService 会抛
  • Java中用多个子类实现父类方法

    我有一堂课 我们称之为A 由几个子类扩展 B C D ETC 在每个子类中 我希望可以从父类的实例化中访问特定的方法A 我试图声明A作为抽象类 并将内部的每个子类方法声明为抽象类 然后我在自己的类中实现了这些方法 但似乎每个子类都必须实现父
  • Vanilla javascript Trap 模式中的焦点(辅助功能选项卡)

    这应该很简单 但由于某种原因它不起作用 我在正确的时间获得了正确的 console logs 但焦点没有到达正确的位置 请参考我的 jsfiddle https jsfiddle net bqt0np9d https jsfiddle ne
  • 使用 XPath Java 设置节点值

    我正在尝试通过 XPath 设置节点值 我有以下内容 但它似乎没有改变实际文件值 XPathFactory factory XPathFactory newInstance XPath xPath factory newXPath xPat
  • 如何在 DynamoDB 中创建 UUID?

    在我的数据库方案中 我需要一个自动增量主键 我怎样才能实现这个功能呢 PS 为了访问 DynamoDB 我使用dynode https github com Wantworthy dynode Node js 模块 免责声明 我是 Dyna
  • 如果空间不足,则隐藏标签 D3 可缩放旭日图

    所以我知道这个答案是为了隐藏不适合图表的文本 D3 如果有足够的空间 在饼图中放置圆弧标签 https stackoverflow com questions 19792552 d3 put arc labels in a pie char
  • 似乎无法清理分离的 DOM 元素

    我在用着jquery ui 选项卡 http jqueryui com tabs 我遇到了删除选项卡时出现的问题 该选项卡及其内容 div 似乎已被删除 但当您查看 Chrome DevTools 配置文件中的堆时 删除选项卡后 您会发现选
  • 相当于 Scala dropWhile

    我正在努力寻找一种方法来根据谓词跳过流开头的某些元素 像这样的事情 dropWhile n gt n lt 3 Stream of 0 1 2 3 0 1 2 3 4 forEach System out println 3 0 1 2 3
  • 通过浏览器后退按钮访问时重新加载网站

    问题 我有一个包含动态内容的网站 每次用户看到它时都需要重新加载 这包括当用户点击另一个站点上的后退按钮并到达需要重新加载的站点时的用例 大多数 全部 浏览器在此事件后不会刷新网站 我的解决方案 不太有效 http www hunlock
  • C++ 异常处理

    所以我正在编写一些代码 我注意到除了语法 类型和其他编译时错误之外 C 不会抛出任何其他异常 所以我决定用一个非常简单的程序来测试一下 include
  • 列表视图设置自定义波纹选择器

    我尝试在以下条件下在 Lollipop 上使用列表视图控件 主题类型是默认的Theme Material 深色主题 列表视图包含在具有白色背景的较大布局内 列表视图应该有一个以白色背景出现的列表选择器 注意 我被迫使用自定义列表选择器颜色
  • Python 换出 sys.modules 并不像直觉那样工作

    我正在尝试设置字典sys modules在寻找答案时另一个问题 https stackoverflow com q 42134260 2988730并发现了一些有趣的事情 链接的问题涉及消除导入模块的所有影响 基于另一个帖子 https s