Python的site-packages文件夹中有些包没有显示出来。

4

Python包列表

这是我机器上的软件包清单。当我尝试使用以下python命令获取软件包及其版本列表时,我只能看到软件包jinja,jsonschema,markupsafe和matplotlib,而软件包"isapi"则不见了。

>>> import pip
>>> ["%s==%s" % (i.key, i.version) for i in pip.utils.pkg_resources.working_set]

结果 / 输出:

['jinja2==2.7.3', 'jsonschema==2.5.1', 'markupsafe==0.23', 'matplotlib==1.4.3']

我的要求是在列表中也要包含("isapi")。是否有可用的选项?请在此处提供您的建议。
提前感谢 :)
2个回答

8

isapi不是PyPI包,也没有使用pip安装。您可以看到这一点,因为没有带有.dist-info后缀的包名称文件夹。

.dist-info文件夹1是由pip作为安装过程的一部分创建的,用于存储关于PyPI包的元信息。它们基本上包含了您可以在PyPI网站上找到的有关软件包的所有信息。除了这些文件夹之外,pip还会添加一个真实软件包名称2的文件夹,其中包含真正的Python模块。

由于您的isapi文件夹显然不来自PyPI包,它来自其他来源。例如,可能是外部设置实用程序只是将文件夹安装在那里。也有可能是不同的PyPI包将文件夹安装为依赖项(但不适用于您的包)。我建议查看文件夹和Python模块,以了解它的功能和来源。

无论如何,由于它没有使用pip安装,因此pip显然不知道它。所以它不会出现在软件包列表中。

很遗憾,没有其他好的方法可以以编程方式找出该模块。一种可能的方法是简单地获取site-packages文件夹的目录列表,然后通过这种方式处理模块。您还可以使用pkgutil模块来获取所有模块(包括内置模块)的列表,并过滤掉在site-packages文件夹中的模块。但除此之外,没有其他“注册表”或类似的东西来跟踪该文件夹中的内容。如果您考虑一下,就会发现不能有这样一个东西,因为您总是可以自己放一个新文件夹进去。

脚注:

1 .dist-info 文件夹是通过 PEP 376 发明的,作为统一管理分发方式的方法。

2 Python 包不需要与 PyPI 包完全拼写相同。这允许在 PyPI 包名称中使用自定义大小写(因为 Python 包应该是小写),甚至可以使用不同的名称。例如,Beautiful Soup 4 的 PyPI 包名称是 beautifulsoup4,但 Python 包只称为 bs4


感谢@poke。我有文件夹adodbapizmq(它们是PyPI模块),是否有可用的选项来显示它们?.dist-info文件夹有什么用? - Ramkumar
还有其他选项(除了“pip”)可以显示软件包列表吗?请在此处分享您的评论。 - Ramkumar
.dist-info 文件夹包含有关 PyPI 包的所有元信息,基本上包括 PyPI 网站显示的所有内容。pip 基本上会添加一个 <package>.dist-info 文件夹,其中包含有关 PyPI 包的信息,以及一个包含模块的文件夹。最安全的显示 site-packages 文件夹中可用软件包的方法可能是获取其目录列表并过滤掉 .dist-info 文件夹。没有其他“注册表”被所有安装程序用于集中提供信息。 - poke

0

试试这个:

import pkgutil
[p[1] for p in pkgutil.iter_modules()]

应该给出所有已安装软件包的名称。


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