如何统计Python requirements.txt或pip freeze输出包的总大小?
统计Python包总存储空间的方法
场景1:统计已安装的所有包(对应pip freeze输出)
方法1:Shell命令(Unix/Linux/macOS,或Windows下用WSL/Git Bash)
直接执行以下命令,自动计算所有已安装pip包的总大小:
pip freeze | xargs -n1 pip show | grep -E 'Location:|Name:' | paste -d ' ' - - | awk '{print $2 "/" $4}' | xargs du -shc | tail -n1
命令逻辑:
- 用
pip freeze列出所有已安装包 - 逐个调用
pip show获取包的安装位置和名称 - 拼接成包的实际存储路径
- 用
du计算每个路径的大小并汇总求和
方法2:Python脚本(跨平台,支持Windows/macOS/Linux)
创建calc_pkg_size.py脚本,运行后直接输出总大小:
import os import subprocess import sys def get_package_size(package_name): try: show_output = subprocess.check_output( [sys.executable, "-m", "pip", "show", package_name], text=True, stderr=subprocess.DEVNULL ) location = None for line in show_output.splitlines(): if line.startswith("Location:"): location = line.split(": ")[1].strip() break if not location: return 0 pkg_dir_name = package_name.replace("-", "_") pkg_path = os.path.join(location, pkg_dir_name) if not os.path.exists(pkg_path): pkg_path = os.path.join(location, package_name) if not os.path.exists(pkg_path): return 0 total_size = 0 for root, _, files in os.walk(pkg_path): for file in files: file_path = os.path.join(root, file) try: total_size += os.path.getsize(file_path) except OSError: continue return total_size except subprocess.CalledProcessError: return 0 def format_size(size_bytes): for unit in ['B', 'KB', 'MB', 'GB']: if size_bytes < 1024.0: return f"{size_bytes:.2f} {unit}" size_bytes /= 1024.0 return f"{size_bytes:.2f} TB" def main(): freeze_output = subprocess.check_output( [sys.executable, "-m", "pip", "freeze"], text=True ).splitlines() package_names = [pkg.split("==")[0].strip() for pkg in freeze_output if "==" in pkg] total_bytes = 0 for pkg in package_names: total_bytes += get_package_size(pkg) print(f"已安装包总存储空间: {format_size(total_bytes)}") if __name__ == "__main__": main()
运行脚本:
python calc_pkg_size.py
场景2:统计requirements.txt中指定包的总大小
方法1:Shell命令(Unix/Linux/macOS)
确保requirements.txt中的包已安装,执行以下命令:
cat requirements.txt | grep -v '^#' | xargs -n1 pip show | grep -E 'Location:|Name:' | paste -d ' ' - - | awk '{print $2 "/" $4}' | xargs du -shc | tail -n1
说明:grep -v '^#'会忽略requirements.txt中的注释行。
方法2:修改Python脚本支持读取requirements.txt
修改calc_pkg_size.py的main函数,使其支持传入requirements.txt路径:
def main(): if len(sys.argv) != 2: print("用法: python calc_pkg_size.py <requirements文件路径>") sys.exit(1) req_file_path = sys.argv[1] with open(req_file_path, 'r', encoding='utf-8') as f: lines = [line.strip() for line in f if line.strip() and not line.startswith("#")] package_names = [] for line in lines: if any(op in line for op in ["==", ">=", "<=", ">", "<", "~="]): op = next((o for o in ["==", ">=", "<=", ">", "<", "~="] if o in line), None) pkg_name = line.split(op)[0].strip() else: pkg_name = line.strip() package_names.append(pkg_name) total_bytes = 0 for pkg in package_names: total_bytes += get_package_size(pkg) print(f"requirements.txt中包总存储空间: {format_size(total_bytes)}")
运行脚本:
python calc_pkg_size.py requirements.txt
内容的提问来源于stack exchange,提问作者AJR
相关产品推荐
相关产品推荐

