如何通过编程获取已安装Python包的详细信息(pip show等效实现)
你可以通过编程方式获取pip show返回的所有字段,以下是几种不同场景的实现方案:
方案1:使用Python标准库实现(最稳定,推荐)
Python 3.8及以上版本自带importlib.metadata模块,无需依赖pip的内部接口,不会受pip版本变动影响:
from importlib.metadata import get_distribution, distributions, PackageNotFoundError def get_required_by(package_name: str) -> list: try: # 获取目标包的标准名称,避免大小写或命名格式差异 target_dist = get_distribution(package_name) target_name = target_dist.metadata["Name"] required_by = [] # 遍历所有已安装的包 for dist in distributions(): # 跳过没有依赖声明的包 if not dist.requires: continue # 提取所有依赖的包名(去掉版本限制符) dep_names = [req.split()[0] for req in dist.requires] if target_name in dep_names: required_by.append(dist.metadata["Name"]) return required_by except PackageNotFoundError: # 目标包未安装的情况返回空列表 return [] # 示例:查询requests的Required-by字段 print(get_required_by("requests"))
方案2:直接调用pip命令解析输出(兼容性最好)
如果需要兼容所有Python和pip版本,可以直接调用pip show命令解析输出,写法最简单:
import subprocess import sys def get_required_by(package_name: str) -> list: # 调用当前Python环境对应的pip命令,避免多环境冲突 res = subprocess.run( [sys.executable, "-m", "pip", "show", package_name], capture_output=True, text=True ) # 命令执行失败(比如包未安装)返回空列表 if res.returncode != 0: return [] # 遍历输出行查找Required-by字段 for line in res.stdout.splitlines(): if line.startswith("Required-by:"): return [item.strip() for item in line.removeprefix("Required-by:").split(",")] return [] # 示例:查询requests的Required-by字段 print(get_required_by("requests"))
方案3:调用pip内部API(适合低版本Python)
如果你的Python版本低于3.8,可以使用pip的内部接口实现,但要注意pip内部接口可能随版本更新发生变动:
from pip._internal.utils.misc import get_installed_distributions from pkg_resources import get_distribution, PackageNotFoundError def get_required_by(package_name: str) -> list: try: target_name = get_distribution(package_name).project_name required_by = [] for dist in get_installed_distributions(): requires = dist.requires() if not requires: continue dep_names = [req.project_name for req in requires] if target_name in dep_names: required_by.append(dist.project_name) return required_by except PackageNotFoundError: return [] # 示例:查询requests的Required-by字段 print(get_required_by("requests"))
内容的提问来源于stack exchange,提问作者Volatil3
相关产品推荐
相关产品推荐

