The Fiefdom of Files

A map of PyPi

Python 包依赖关系图谱

2025年2月28日

PyPi,即 Python Software Foundation 的包仓库,拥有超过 50 万个开源项目。 鉴于我每天都在使用其中的许多项目,我认为更好地了解这组包并表达一些感谢之情是合适的。 该索引网站提供了很好的搜索和过滤功能,这在寻找特定内容时非常有用。 但在这里,我们希望一次性查看每个包,构建可视化图,甚至可能发现一些很棒的新包。

因此,为了可视化这个集合,我们需要了解它的结构。 幸运的是,PyPi 提供了一个很好的 JSON API(例如,参见 这里 关于 numpy 的条目),更幸运的是,BigQuery 上有一个副本,这样我们就不必用超过 60 万个请求来打扰可怜的 PyPi 服务器了。

一个 SQL 查询后,我们得到了所有我们想要的元数据的 .jsonl 文件。 那么我们想要什么元数据呢? 由于我们想要揭示数据集的内部结构,因此我们专注于开源的定义特性,并查看每个包的依赖关系。 这给出了一个自然的有向图拓扑。 难得的是,依赖地狱实际上是有帮助的!

五十万个节点对于交互式图来说太多了,这促使我们更仔细地查看数据。 与所有大型数据集一样,BigQuery 镜像很混乱,包含许多不太经典的 Python 包,例如 "the-sims-freeplay-hack"、"cda-shuju-fenxishi-202209-202302" 和其他附属品。 这些似乎已被 PyPi 检测到并已删除,因为它们没有包网站。 因此,为了缩小到合理大小的数据集,我们筛选掉一些重要列不为空的包。 这使我们降到了大约 10 万个,因此我们有些随意地筛选掉了依赖项少于 2 个的包(让他们填写他们依赖的包),以便获得更小的测试数据集。 我们使用所有依赖项,包括实验性的、开发的和测试的依赖项。

图布局是经典的计算机科学问题,我们可以使用专门为此类任务设计的便捷软件,例如 Gephi。 这使我们可以使用我们选择的算法,并且在尝试了几种算法之后,我发现默认的 Force Atlas 2(一种迭代的弹簧能量最小化算法)效果最好。 这是意料之中的! (Daniel Spielman 的 这个精彩演讲 将说服您喜欢力导向图布局,如果您还没有的话。)

这是交互式图: Load Map! Load Big Map. (Bad performance ahead.) Close ChartO 我本以为结果会是一个非常紧密的云,以最常见的包为中心,几乎没有聚类。 这或多或少就是发生的情况——两个维度根本不足以捕捉高度连接图的邻域。 平均度数为 4.97。 但这并非全部。

我们获得了依赖于同一组包的包集群。 有些是无辜的:例如,仅依赖于 numpy 是一件非常好的事情,事实上,我希望该集群更大。 但另一个集群只包含依赖于 "peppercorn"、"check-manifest" 和 "coverage" 的包。 在那里,我们找到了诸如 "among-us-always-imposter-hack" 之类的包。 我想通过之前的过滤器做得很好! 这些是从名为 pqc 的模板 Python 包复制的,并且已未初始化地上载。 那些具有明显垃圾名称的已被删除,但一些奇怪的名称仍然存在。 自 2019 年 5 月上传以来,一个名为 "python-smshub-org" 的 10 个包的子集群一直存在于其中。 据我所知,目前没有在线包包含恶意代码,但我认为这是一个图绘制可以找到异常的初步验证。 真棒!

一些组织生成了大量 Python 包。 例如,一家名为 Triton 的企业软件杂项公司发布了 300 多个以其名称命名的包。 它们都依赖于同一个基本包,因此可视化结果会聚集在一起。 也许最大的一个是另一家企业软件公司 Odoo,其主要包有超过 3000 个子包。 类似的组包括一家名为 Airbyte 的数据管道公司,拥有 320 个包,Objective C 桥 PyObjC 拥有 167 个包,以及内容管理系统 Plone。 一个名为 aiobotocore 的企业 API 客户端显然仅为其类型使用了 421 个包。

基于能量的布局还可以找到可识别的语义邻域。 有些我更了解,例如 numpy 北部的 scikit-learn、seaborn 和 tensorflow。 其他了解较少,例如 cryptography 周围的区域。 这已经是一种很好的窗口购物方式,但我非常确定这只是触及了该数据集的表面。 一些进一步的步骤是很好地可视化递归依赖树,提高性能,并添加搜索。

编辑:幸运的是,正如一位读者建议的那样,这个概念的更成熟版本具有更好的 UI,可在此处获得 要复制此操作,请参阅随附的存储库

© 2021 - 2025 fi-le.net, the fiefdom of files | Newsletter Signup: