当我尝试导入pip包并使用pip.get_installed_distributions()时,console打印错误:
AttributeError: 'module' object has no attribute 'get_installed_distributions'有没有什么解决方案可以排除降级pip?
发布于 2018-04-19 22:41:36
更新
在Python3.8中,标准库提供了一种在环境中查询已安装发行版及其元数据的方法:importlib.metadata。对于较早的Python版本,有一个后端口importlib_metadata
$ pip install importlib-metadata因此,建议使用它(或后端),而不是依赖于pip的内部结构。
具有向后兼容性的导入:
import sys
if sys.version_info >= (3, 8):
from importlib import metadata as importlib_metadata
else:
import importlib_metadata使用示例:
获取所有已安装发行版的名称、版本和许可证(请查看core metadata spec中更多可用的元数据密钥):
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}')按名称查询单次分发:
wheel = importlib_metadata.distribution('wheel')
print(wheel.metadata["Name"], 'installed')原始答案:
该函数已移至pip._internal子包。支持向后兼容的导入示例:
try:
from pip._internal.utils.misc import get_installed_distributions
except ImportError: # pip<10
from pip import get_installed_distributions发布于 2018-04-25 02:35:34
@hoefling不推荐也是不好的做法,从pip._internal导入项目,pip已经对此发出警告,在pip 10发布之前,他们也做了一个关于这方面的announcement。
一个不错的选择是使用setuptools pkg_resources。在那里,您可以使用pkg_resources.working_set。请参阅@pradyunsg here的评论。
import pkg_resources
dists = [d for d in pkg_resources.working_set]
# You can filter and use information from the installed distributions.发布于 2018-07-14 07:52:32
除了@Mmelcor answer之外,列表理解中返回的项目是一个PathMetadata对象,类似于:
[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),....]在过滤之前,您可能需要获取字符串表示:
import pkg_resources
dists = [str(d) for d in pkg_resources.working_set]
print(dists)结果:
['wrapt 1.10.11',
'widgetsnbextension 3.2.1',...]https://stackoverflow.com/questions/49923671
复制相似问题