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

如何查询已安装Python库的extras(变体)?

检查Python库Extras是否已安装的通用方案

首先明确:pip本身不会记录你是否通过[extra]的方式安装库,因为Extras本质是绑定了一组额外依赖,库本身的版本和基础版完全一致,所以pip freeze或pip show无法直接区分。以下是通用的检查思路,不依赖特定库的逻辑:

方法1:通过包Metadata+依赖检查脚本

每个包的Extras定义都在它的Metadata里,我们可以先获取Extras列表,再验证对应依赖是否全部安装:

  1. 查看包的所有可用Extras
    执行以下命令(替换<package-name>为目标库名):

    pip show --json <package-name> | python -c "import json, sys; print(json.load(sys.stdin)['extras'])"
    

    比如查看dask的Extras:

    pip show --json dask | python -c "import json, sys; print(json.load(sys.stdin)['extras'])"
    
  2. 验证指定Extra是否已安装
    用下面的通用脚本检查,它会读取包的Metadata提取Extra依赖,再逐一验证依赖是否存在:

    import json
    import subprocess
    import sys
    
    def check_extra(package_name, extra_name):
        # 获取包的Metadata
        meta_result = subprocess.run(
            ["pip", "show", "--json", package_name],
            capture_output=True,
            text=True
        )
        if meta_result.returncode != 0:
            print(f"错误:未找到包 {package_name}")
            return False
        metadata = json.loads(meta_result.stdout)
        
        # 检查Extra是否存在
        if extra_name not in metadata.get('extras', []):
            print(f"错误:包 {package_name} 不存在 {extra_name} 这个Extra")
            return False
        
        # 提取该Extra对应的所有依赖
        extra_dependencies = []
        for req in metadata.get('requires_dist', []):
            if f"; extra == '{extra_name}'" in req:
                # 清理依赖字符串,只保留包名
                dep_raw = req.split(';')[0].strip()
                dep_name = dep_raw.split('[')[0].split('=')[0].split('<')[0].split('>')[0].strip()
                extra_dependencies.append(dep_name)
        
        # 检查每个依赖是否已安装
        missing_deps = []
        for dep in extra_dependencies:
            check_result = subprocess.run(["pip", "show", dep], capture_output=True)
            if check_result.returncode != 0:
                missing_deps.append(dep)
        
        if missing_deps:
            print(f"Extra {extra_name} 未完全安装,缺失依赖:{', '.join(missing_deps)}")
            return False
        else:
            print(f"Extra {extra_name} 已完全安装")
            return True
    
    if __name__ == "__main__":
        if len(sys.argv) != 3:
            print("使用方式:python check_extra.py <包名> <Extra名称>")
            sys.exit(1)
        check_extra(sys.argv[1], sys.argv[2])
    

    用法示例:

    python check_extra.py dask complete
    

方法2:利用setuptools内置的pkg_resources

pkg_resources可以直接验证Extra的依赖是否满足,返回已安装的Extras列表:

import pkg_resources

def get_installed_extras(package_name):
    try:
        dist = pkg_resources.get_distribution(package_name)
        installed_extras = []
        # 逐一验证每个Extra的依赖是否都满足
        for extra in dist.extras:
            try:
                pkg_resources.require(f"{package_name}[{extra}]")
                installed_extras.append(extra)
            except pkg_resources.DistributionNotFound:
                continue
        return installed_extras
    except pkg_resources.DistributionNotFound:
        return []

# 示例:查看dask已安装的Extras
print(get_installed_extras('dask'))

注意事项

  • 以上方法都是通过依赖是否存在反推Extra状态,因为pip不记录安装方式。如果手动安装了某个Extra的所有依赖但没通过package[extra]命令安装,方法会判定为已安装该Extra,这是Extras的本质决定的(它只是依赖集合的别名)。
  • 方法2的pkg_resources.require会验证依赖的版本是否符合Extra的要求,比方法1的简单检查更严谨。

内容的提问来源于stack exchange,提问作者SeF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:22:52