如何查询已安装Python库的extras(变体)?
检查Python库Extras是否已安装的通用方案
首先明确:pip本身不会记录你是否通过[extra]的方式安装库,因为Extras本质是绑定了一组额外依赖,库本身的版本和基础版完全一致,所以pip freeze或pip show无法直接区分。以下是通用的检查思路,不依赖特定库的逻辑:
方法1:通过包Metadata+依赖检查脚本
每个包的Extras定义都在它的Metadata里,我们可以先获取Extras列表,再验证对应依赖是否全部安装:
查看包的所有可用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'])"验证指定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
相关产品推荐
相关产品推荐

