You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程获取已安装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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 12:00:04