如果您输入以下内容:
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(使用前将#替换为@)