这些是我的机器中显示的软件包列表。当我尝试使用以下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”)。有没有可用的选择?请在此处提供您的建议。
提前致谢:)
答案 0 :(得分:7)
isapi
为not a PyPI package,未安装pip。您可以看到这一点,因为没有带有.dist-info
后缀的包名称的文件夹。
作为安装过程的一部分,由{pip}创建.dist-info
文件夹 1 以存储有关PyPI包的元信息。它们基本上包含有关包的所有信息,您也可以在PyPI网站上找到它们。在这些文件夹旁边,pip将为实际包添加一个包含真实包名称 2 的包含真实Python模块的包。
由于您的isapi
文件夹显然不是来自PyPI包,而是来自其他来源。例如,这可以是一个外部设置实用程序,只需在其中安装该文件夹即可。也可能是一个不同的PyPI包将文件夹作为依赖项安装(虽然不是你的包的情况)。我建议查看文件夹和Python模块,以了解它的作用以及它可能来自何处。
无论如何,由于它没有安装pip,pip显然不知道它。因此它不会出现在包列表中。
不幸的是,没有其他好方法可以通过编程方式找到该模块。一种可能的方法是简单地获取site-packages
文件夹的目录列表,并以这种方式处理模块。您还可以使用pkgutil
module获取所有模块(包括内置模块)的列表,并过滤掉site-packages
文件夹中的模块。但除此之外,没有其他“注册”或其他东西可以跟踪该文件夹中的内容。如果你考虑一下,就不会有,因为你总是可以自己放一个新的文件夹。
脚注:
使用PEP 376发明了 1 .dist-info
个文件夹,作为统一分发管理方式的一种方式。
2 Python包不需要像PyPI包一样拼写。这允许在PyPI包的名称中使用自定义大小写(因为Python包应该是小写的),甚至是不同的名称。例如,Beautiful Soup 4的PyPI包名称为beautifulsoup4,但Python包名为bs4
。
答案 1 :(得分:0)
试试这个:
import pkgutil
[p[1] for p in pkgutil.iter_modules()]
应该为您提供所有已安装软件包的名称。