获取已安装包的描述而不实际导入它

2024-04-23

如果您输入以下内容:

import somemodule
help(somemodule)

它将打印出分页的包描述。我需要获得与字符串相同的描述,但不将此包导入到当前命名空间。这可能吗?确实如此,因为在 Python 中一切皆有可能,但是最优雅/Python 的方式是什么?

旁注:通过优雅的方式,我的意思是无需打开单独的进程并捕获其标准输出...;)

换句话说,有没有办法查看未导入但已安装的包并获取其描述?也许与importlib.abc.InspectLoader?但我不知道如何让它按照我需要的方式工作。

更新:我不仅需要不污染命名空间,而且还需要在内存和内存中不留下任何自身或依赖模块的痕迹。sys.modules等等,就像它从未真正进口过一样。

更新:在有人问我为什么需要它之前 - 我想列出所有已安装的 python 包及其描述。但在此之后我不想将它们导入sys.modules也不占用过多的内存空间,因为它们可能有很多。


您需要导入模块才能获取帮助字符串的原因是,在许多情况下,帮助字符串实际上是在代码中生成的。解析这样一个包的文本来获取字符串是毫无意义的困难,因为您必须编写一个小型 Python 解释器来重建实际的字符串。

话虽这么说,有一些方法可以完全删除基于临时导入的模块这个答案 https://stackoverflow.com/a/487718/2988730,它总结了 2003 年左右出现在 Python 邮件列表上的一个线程:http://web.archive.org/web/20080926094551/http://mail.python.org/pipermail/python-list/2003-December/241654.html http://web.archive.org/web/20080926094551/http://mail.python.org/pipermail/python-list/2003-December/241654.html。此处描述的方法通常仅在该模块未在其他地方引用时才有效。否则模块将被卸载import将从头开始重新加载它,而不是使用现有的sys.modules条目,但该模块仍将驻留在内存中。

这是一个函数,它几乎可以完成您想要的操作,如果模块似乎尚未卸载,甚至会打印警告。与链接答案中提出的解决方案不同,该函数实际上处理了加载模块的所有副作用,包括导入一个包可能会将其他外部包导入到sys.modules:

import sys, warnings
def get_help(module_name):
    modules_copy = sys.modules.copy()
    module = __import__(module_name)
    h = help(module)
    for modname in list(sys.modules):
        if modname not in modules_copy:
            del sys[modname]
    if sys.getrefcount(module) > 1:
        warnings.warn('Module {} is likely not to be completely wiped'.format(module_name))
    del module
    return h

我在最后一个循环中列出键列表的原因是,在迭代字典(或任何其他可迭代对象)时修改它是不可取的。至少在Python 3中,dict.keys()返回由字典本身支持的可迭代对象,而不是冻结副本。我不确定是否h = ... and return h甚至是必要的,但在最坏的情况下,h只是None.

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

获取已安装包的描述而不实际导入它 的相关文章

随机推荐

  • 在Tensorflow中,sampled_softmax_loss和softmax_cross_entropy_with_logits有什么区别

    在张量流中 有一些方法称为softmax cross entropy with logits https www tensorflow org versions master api docs python tf nn softmax cr
  • 如何使用具有圆角背景的文本覆盖图像

    我需要在 HTML 中复制您在此图中看到的内容 问题是文本覆盖了 div 和背景图像 如果外部 div 中没有图像并且没有纯色 我可以想象我可以相当轻松地使用一些带有圆角的小 html 元素放置在正确的位置来完成此操作 但是背景图像是是什么
  • 使用 PHP MySQL 创建嵌套 JSON

    我有一个返回某些字段的 SQL 查询 我正在使用json encode 获取 JSON 格式的数据 但是我无法以我想要的格式获取它 PHP代码
  • 递归函数提取所有叶节点

    我正在尝试递归遍历 json 树并提取所有叶节点 子节点 null 并返回一个平面列表 我没有得到完整的清单 我只得到一件物品 我想我已经快到了 但我不太清楚我在这里犯了什么错误 请指教 let cluster children child
  • 获取选定的文本位置

    目前 我正在浏览器中获取选定的文本 执行以下操作 window getSelection 现在 当按下自定义键时 我需要在该文本上方显示一个工具提示 请注意 鼠标不能再位于文本上方 因此为了做到这一点 我需要该所选文本的绝对位置 有没有办法
  • 将面板添加到框架,但在应用程序运行时不显示[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 框架中有两个面板 顶部有一个菜单栏 菜单栏显示得很好 到目前为止设置的任何操作都有效 但其他两个面板从未出现 我尝试重新追踪将它们添加到框架上的所有面板和线条 但找不到任何错误 两个窗格中
  • 为什么访问 PerformanceCounter 会导致第 2 代垃圾回收

    当我从 C 应用程序中访问某些 PerformanceCounters 时 我看到一些奇怪的行为 例如 当我访问 Process Private Bytes 时 似乎我得到了很多第 2 代垃圾收集 对于其他进程计数器来说似乎也是如此 下面的
  • 如何使用短信内容提供商?文档在哪里?

    我希望能够读取系统的短信内容提供商 基本上我想制作一个短信应用程序 但只有当我可以看到过去的线程等时它才会有用 似乎有一个内容提供程序 但我找不到它的文档 有人知道它在哪里吗 Thanks 编辑 好的 我找到了一种获取短信收件箱提供程序的方
  • Node.js:如何将参数的值从终端传递到JS脚本

    Given a jsdom based svgcreator node js脚本文件 var jsdom require jsdom jsdom env CREATE DOM HOOK http d3js org d3 v3 min js
  • 在使用 ant 为库项目构建 Android 测试时,如何使用 emma 过滤器?

    从这个问题 使用 ant 构建 Android 测试时如何使用 emma 过滤器 https stackoverflow com questions 7360972 how can i use filter for emma when bu
  • 谷歌电子表格中的数据绑定?

    是否可以编写一个将两个单元 绑定 在一起的谷歌应用脚 本 例如 如果编辑一张工作表中的单元格 它将自动更新另一张工作表中的匹配单元格 因此 如果sheet1在单元格A1中有一个表示 花费的钱 的值 并且sheet2在单元格B4中有一个表示相
  • 使用 C++ 中的 java 套接字接收浮点数

    我需要使用套接字从 C 客户端到 java 服务器接收包含浮点数的数组或类 但 InputStreamReader 没有得到正确的结果 任何原因 任何有关更简单方法的建议将不胜感激 谢谢 Java服务器代码 public static vo
  • 检测流中的重复组

    我想确保列表中的所有数字都分组在一起 让我用例子来解释这一点 1 1 1 2 2 OK two distinct groups 1 1 2 2 1 1 Bad two groups with 1 1 2 3 4 OK 4 distinct
  • 缩放变换导致与 Flex 布局的渲染间隙

    我使用 Flex 布局来渲染具有 3 个大小均匀的列的容器 div 它的工作原理正如我所期望的那样 直到我应用比例变换 当容器缩小时 内容框之间会出现细小的间隙 该问题发生在 MacOS Chrome 和 Safari 上 但不会发生在 F
  • 使用 ggplot2 对多个梯度进行分组

    我对 R 还很陌生 所以如果答案显而易见 或者我的数据组织得不好 我深表歉意 我试图绘制声音字符 熵 随时间的差异 我使用拍号信息将录音分成 回合 我能够创建一个散点图 其中的线条对应于回合数 0 9 代码看起来像这样 newbout lt
  • DataGrid 格式中的 WPF RichTextBox 混乱

    我需要在 DataGrid 的列中使用 RichTextBox 这是通过 xaml 完成的
  • 如何保留使用 MCV5/OWIN 更新的 cookie 声明

    我们正在开发一个 OWIN MVC5 项目 我们使用自己的实现IUserStore
  • 如何特别为特定模块指定 gcc 标志 (CXXFLAGS)?

    我最近正在构建一个新的 NS3 模块 在我的代码中 我使用了一些新功能C 11 c 0x 我想添加一个gcc标志 CXXFLAGS std c 0x to the waf配置系统 我尝试这样做 CXXFLAGS std c 0x waf c
  • 内联汇编 - cdecl 和准备堆栈

    我最近一直在尝试通过使用缓冲区和不同汇编运算符的原始十六进制等效项来实现 C 中的动态函数 为了说明一个简单的跳转 byte buffer new buffer 5 buffer 0xE9 Hex for jump uint buffer
  • 获取已安装包的描述而不实际导入它

    如果您输入以下内容 import somemodule help somemodule 它将打印出分页的包描述 我需要获得与字符串相同的描述 但不将此包导入到当前命名空间 这可能吗 确实如此 因为在 Python 中一切皆有可能 但是最优雅