如何确定未安装的Python包大小?

5 投票
3 回答
5911 浏览
提问于 2025-04-18 12:40

我剩下的空间不多,想要安装一些Python库。

我想知道在安装之前,一个Python库大概有多大(这样我就知道如果空间不够要申请多少额外的空间)。

有没有什么方法可以做到这一点,比如使用pip

3 个回答

1

这是我目前正在使用的脚本

(基于一个很棒的代码包,来自于如何查看已安装的pip包大小?

步骤:

  1. 创建一个Python脚本,检查当前安装的所有pip包
  2. 创建一个Shell脚本,用来创建一个全新的Python环境并安装测试包
  3. 运行Shell脚本
  4. 赚到钱 :)

步骤 1

创建一个名为 tool-size.py 的Python脚本

#!/usr/bin/env python

import os
import pkg_resources

def calc_container(path):
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(path):
        for f in filenames:
            fp = os.path.join(dirpath, f)
            total_size += os.path.getsize(fp)
    return total_size

def calc_installed_sizes():
    dists = [d for d in pkg_resources.working_set]

    total_size = 0
    print (f"Size of Dependencies")
    print("-"*40)
    for dist in dists:
        # ignore pre-installed pip and setuptools
        if dist.project_name in ["pip", "setuptools"]:
            continue
        try:
            path = os.path.join(dist.location, dist.project_name)
            size = calc_container(path)
            total_size += size
            if size/1000 > 1.0:
                print (f"{dist}: {size/1000} KB")
                print("-"*40)
        except OSError:
            '{} no longer exists'.format(dist.project_name)

    print (f"Total Size (including dependencies): {total_size/1000} KB")

if __name__ == "__main__":
    calc_installed_sizes()

步骤 2

创建一个名为 tool-size.sh 的Bash脚本

#!/usr/bin/env bash

# uncomment to to debug
# set -x

rm -rf ~/.virtualenvs/tool-size-tester
python -m venv ~/.virtualenvs/tool-size-tester
source ~/.virtualenvs/tool-size-tester/Scripts/activate
pip install -q $1
python tool-size.py
deactivate

步骤 3

运行脚本,输入你想要查看大小的包

tool-size.sh xxx

比如说对于truffleHog3

$ ./tool-size.sh truffleHog3

Size of Dependencies
----------------------------------------
truffleHog3 2.0.6: 56.46 KB
----------------------------------------
smmap 4.0.0: 108.808 KB
----------------------------------------
MarkupSafe 2.0.1: 40.911 KB
----------------------------------------
Jinja2 3.0.1: 917.551 KB
----------------------------------------
gitdb 4.0.7: 320.08 KB
----------------------------------------
Total Size (including dependencies): 1443.81 KB


2

如果你有一个 requirements.txt 文件,可以使用这个脚本:

#!/bin/bash
# by rubo77: https://stackoverflow.com/a/68278901/1069083

mkdir -p /tmp/pip-size
for i in $(pip-sync -n requirements.txt|tail -n +2); do
  echo -ne "$i:\t"
  wget --quiet -O /tmp/pip-size/$i https://pypi.org/pypi/$i/json
  cat /tmp/pip-size/$i | jq 'last(.releases[])'[].size | paste -sd+ | bc > /tmp/pip-size/$i.size
  cat /tmp/pip-size/$i.size | awk '{$1=$1/1024/1024; print $1,"MB";}'
done
echo -e "--------\ntotal:"
cat /tmp/pip-size/*.size  | paste -sd+ | bc | awk '{$1=$1/1024/1024; print $1,"MB";}';

输出示例:

ninja:  1.4366 MB
numpy:  120.735 MB
opencv-python:  724.788 MB
pillow: 137.695 MB
scikit-image:   7.46707 MB
torch:  4772.73 MB
torchvision:    153.842 MB
--------
total:
5918.69 MB
9

根据我所知道的,使用 pip 是无法做到这一点的。不过,如果这个软件包在 PyPI 上托管,你可以在网址后面加上 /json 来查看更多详细信息,包括文件大小。

比如,你可以访问 https://pypi.python.org/pypi/pip/json,看看 releases 这个键里的内容。每个版本的 size 会告诉你下载的大小。

需要注意的是,这里显示的是下载的大小,而不是安装后的大小(因为一个软件包在安装时可能会需要额外的依赖,解压缩文件后也可能会占用更多空间)。所以在安装之前,你的问题可能很难回答。

撰写回答