首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PIP10.0.0版本中有没有替代pip.get_installed_distributions()的函数?

PIP10.0.0版本中有没有替代pip.get_installed_distributions()的函数?
EN

Stack Overflow用户
提问于 2018-04-19 22:31:35
回答 3查看 6.1K关注 0票数 7

当我尝试导入pip包并使用pip.get_installed_distributions()时,console打印错误:

代码语言:javascript
复制
 AttributeError: 'module' object has no attribute 'get_installed_distributions'

有没有什么解决方案可以排除降级pip?

EN

回答 3

Stack Overflow用户

发布于 2018-04-19 22:41:36

更新

在Python3.8中,标准库提供了一种在环境中查询已安装发行版及其元数据的方法:importlib.metadata。对于较早的Python版本,有一个后端口importlib_metadata

代码语言:javascript
复制
$ pip install importlib-metadata

因此,建议使用它(或后端),而不是依赖于pip的内部结构。

具有向后兼容性的导入:

代码语言:javascript
复制
import sys

if sys.version_info >= (3, 8):
    from importlib import metadata as importlib_metadata
else:
    import importlib_metadata

使用示例:

获取所有已安装发行版的名称、版本和许可证(请查看core metadata spec中更多可用的元数据密钥):

代码语言:javascript
复制
dists = importlib_metadata.distributions()
for dist in dists:
    name = dist.metadata["Name"]
    version = dist.version
    license = dist.metadata["License"]
    print(f'found distribution {name}=={version}')

按名称查询单次分发:

代码语言:javascript
复制
wheel = importlib_metadata.distribution('wheel') 
print(wheel.metadata["Name"], 'installed')

原始答案:

该函数已移至pip._internal子包。支持向后兼容的导入示例:

代码语言:javascript
复制
try:
    from pip._internal.utils.misc import get_installed_distributions
except ImportError:  # pip<10
    from pip import get_installed_distributions
票数 15
EN

Stack Overflow用户

发布于 2018-04-25 02:35:34

@hoefling不推荐也是不好的做法,从pip._internal导入项目,pip已经对此发出警告,在pip 10发布之前,他们也做了一个关于这方面的announcement

一个不错的选择是使用setuptools pkg_resources。在那里,您可以使用pkg_resources.working_set。请参阅@pradyunsg here的评论。

代码语言:javascript
复制
import pkg_resources

dists = [d for d in pkg_resources.working_set]
# You can filter and use information from the installed distributions.
票数 7
EN

Stack Overflow用户

发布于 2018-07-14 07:52:32

除了@Mmelcor answer之外,列表理解中返回的项目是一个PathMetadata对象,类似于:

代码语言:javascript
复制
[wrapt 1.10.11 (/Users/<username>/path/venv/lib/python3.6/site-packages),
 widgetsnbextension 3.2.1 (/Users/<username>/path/venv/lib/python3.6/site-packages),....]

在过滤之前,您可能需要获取字符串表示:

代码语言:javascript
复制
import pkg_resources
dists = [str(d) for d in pkg_resources.working_set]
print(dists)

结果:

代码语言:javascript
复制
['wrapt 1.10.11',
 'widgetsnbextension 3.2.1',...]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49923671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档