动态获取标准库Python包名称列表

6
我希望能够获得所有标准库包的名称列表。
我的意思是那些列在我考虑解析https://docs.python.org/3/library/中的字符串name中的包。
__import__(name)

sys.builtin_module_names 看起来很有前途,但那不是它。

我想解析~/.pyenv/versions/3.8.6/lib/python3.8/https://docs.python.org/3/library/,但肯定有更好的方法!

补充

对于那些需要X for a Y的人:我正在静态导航软件包的导入以进行分析--即查看使用了哪些第三方软件包、标准库,以及频率等等。


为什么?那不是一条有用的信息。你可以通过每个sys.path目录进行全局搜索,但你会用这些信息做什么呢? - Tim Roberts
5
发现 XY 问题始终是有价值的,但一个目标并不一定要有用才能引人入胜。 - ti7
@TimRoberts,通过遍历sys.path进行全局搜索会给我提供一个可导入名称的超集,包括非标准库的名称,是这样吗?至于X对我的Y...我会将其添加到我的问题中,以避免XY问题。 - thorwhalen
是的,那正是我想要的,但似乎这样做很复杂。我最好还是爬取和解析所有 https://docs.python.org/VERSION/library/ 页面,并编写自己的包来获取这些信息。至少那样会更准确。 - thorwhalen
抓取的数据发布在此处:https://github.com/i2mint/unbox/tree/master/unbox/data/standard_lib_names - thorwhalen
显示剩余2条评论
1个回答

1

我会在这里发布我的解决方案,但在接受其作为最佳答案之前,我会等待看看是否有更好的。

安装unbox并执行以下操作:

from unbox import builtin_module_names

这应该会为您提供Python环境版本的一组名称(支持2.7和3.5-3.9)。
我从https://docs.python.org/{version}/library/ HTML页面中解析出这些名称列表,并过滤掉了那些无法导入的名称(从3.8开始)。您可以通过执行以下操作来验证所有名称是否可导入:
for name in builtin_module_names:
    _ = importlib.import_module(name)

这些名称包含在软件包的数据文件夹中(以.csv文件形式),可以在github上找到。
请注意,您在其中不会找到所有模块 - 只有那些被记录在该页面上并且可导入的模块。例如,像thisantigravity这样的复活节彩蛋不会列出。您可以在更大的scanned_standard_lib_names集合中找到它们,该集合通过扫描本地文件获得:
from unbox import scanned_standard_lib_names
assert scanned_standard_lib_names.issuperset({'this', 'antigravity'})

1
你是如何获取模块列表的?例如,this 模块缺失。 - a_guest
你说得对 - 我在文本中留下了一个空缺,我本来想粘贴从哪里解析数据的链接。我现在编辑了答案,并包括了更多关于如何找到你的彩蛋(thisantigravity...)的信息。你可以在这里找到我用来获取、解析和保存数据的脚本。 - thorwhalen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接