如何查看安装的 pip 包大小?

Posted

技术标签:

【中文标题】如何查看安装的 pip 包大小?【英文标题】:How to see pip package sizes installed? 【发布时间】:2016-03-19 21:10:19 【问题描述】:

我不确定这是否可能。谷歌似乎没有任何答案。

运行 Linux Debian 可以列出所有已安装的 pip 包和大小(使用的磁盘空间量)吗?

即列出所有pip 磁盘大小的包?

【问题讨论】:

【参考方案1】:

可以试试这个(虽然有点长,也许有更好的解决方案):

$ pip list | xargs pip show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - - | awk 'print $2 "/" tolower($1)' | xargs du -sh 2> /dev/null

输出应如下所示:

80K     /home/lord63/.pyenv/versions/2.7.11/envs/py2/lib/python2.7/site-packages/blinker
3.8M    /home/lord63/.pyenv/versions/2.7.11/envs/py2/lib/python2.7/site-packages/docutils
296K    /home/lord63/.pyenv/versions/2.7.11/envs/py2/lib/python2.7/site-packages/ecdsa
340K    /home/lord63/.pyenv/versions/2.7.11/envs/py2/lib/python2.7/site-packages/execnet
564K    /home/lord63/.pyenv/versions/2.7.11/envs/py2/lib/python2.7/site-packages/fabric
1.4M    /home/lord63/.pyenv/versions/2.7.11/envs/py2/lib/python2.7/site-packages/flask
316K    /home/lord63/.pyenv/versions/2.7.11/envs/py2/lib/python2.7/site-packages/httplib2
1.9M    /home/lord63/.pyenv/versions/2.7.11/envs/py2/lib/python2.7/site-packages/jinja2
...

如果软件包安装在Location/Name 中应该可以工作。 (位置和名称来自pip show <package>


pip show <package> 会告诉你位置:

---
Metadata-Version: 2.0
Name: Flask
Version: 0.10.1
Summary: A microframework based on Werkzeug, Jinja2 and good intentions
Home-page: http://github.com/mitsuhiko/flask/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD
Location: /home/lord63/.pyenv/versions/2.7.11/envs/py2/lib/python2.7/site-packages
Requires: itsdangerous, Werkzeug, Jinja2

我们得到NameLocation加入他们得到位置,最后使用du -sh得到包大小。

【讨论】:

效果很好。要按大小排序,我们可以添加:| sort -h 到上面的 pip 列表 | xargs pip show.... 命令 gsort 在 Mac OS X 上来自自制软件,因为 Mac 上的标准排序没有 -h 标志 我在我的回答中更正了最后一个 python 版本的命令 这里的一切都对我有用。我正在使用输出标题的pip 18.0,所以我添加了tail -n +3 | awk 'print $1' in between the pip list`和pip show 我用pip3 替换了两个pip 命令,因为我在Mac 上使用pip 用于Python 2,pip3 用于Python 3;然后(类似于@abest 所做的)我在pip3 listxargs pip3 show 之间使用| sed '1,2d' 删除pip3 list 输出中的2 个标题行;然后为了切断完整路径,我添加了| sed -E 's/\/Library\/Frameworks\/Python.framework\/Versions\/3.7\/lib\/python3.7\/site-packages\///g';然后我添加了以字节为单位的反向排序和大小| sed -E 's/([0-9]).([0-9])M/\1\200000/g ; s/ +([0-9]+)M/\1000000/g ; s/([0-9]).([0-9])K/\1\200/g ; s/ +([0-9]+)K/\1000/g' | sort -rn【参考方案2】:

新点子列表格式的新版本:

pip2 list --format freeze|awk -F = 'print $1'| xargs pip2 show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - - | awk 'print $2 "/" tolower($1)' | xargs du -sh 2> /dev/null|sort -h

【讨论】:

这也适用于 pip3:pip3 list --format freeze|awk -F = 'print $1'| xargs pip3 show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - - | awk 'print $2 "/" tolower($1)' | xargs du -sh 2> /dev/null|sort -h【参考方案3】:

针对 pip 版本 18 及更高版本进行了修改:

pip list | tail -n +3 | awk 'print $1' | xargs pip show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - - | awk 'print $2 "/" tolower($1)' | xargs du -sh 2> /dev/null | sort -hr

此命令显示 pip 包,按大小降序排列。

【讨论】:

如果您的终端最初不是英文的,只需在开头添加 LANG=C,因为“Location:|Name:”否则将不匹配...因此LANG=C pip list | tail -n +3 | awk 'print $1' | xargs pip show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - - | awk 'print $2 "/" tolower($1)' | xargs du -sh 2> /dev/null | sort -hr 和瞧! 【参考方案4】:

前往包装网站查找尺寸,例如https://pypi.python.org/pypi/pip/json

然后展开releases,找到版本,查找size(以字节为单位)。

【讨论】:

我知道这一点,但我想列出所有已安装的软件包以及磁盘上的实际大小。 抱歉,pip 命令行工具无法做到这一点。如果要列出已安装的所有内容,请使用“pip freeze” 然后你可以从那里找到每个包(可能在 /usr/local/bin/ 中)并在其上使用 'du -sh directoryName' 来查找大小 如何列出 pip 目录的大小? 网站上也显示:pypi.org/project/pip/#files【参考方案5】:

不过有一种简单的 Pythonic 方法可以找到它。

这里是代码。我们称这个文件为pipsize.py

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



dists = [d for d in pkg_resources.working_set]

for dist in dists:
    try:
        path = os.path.join(dist.location, dist.project_name)
        size = calc_container(path)
        if size/1000 > 1.0:
            print (f"dist: size/1000 KB")
            print("-"*40)
    except OSError:
        ' no longer exists'.format(dist.project_name)

当使用python pipsize.py 运行时,会打印出类似的内容,

pip 21.1.2: 8651.906 KB
----------------------------------------
numpy 1.20.3: 25892.871 KB
----------------------------------------
numexpr 2.7.3: 1627.361 KB
----------------------------------------
zict 2.0.0: 48.54 KB
----------------------------------------
yarl 1.6.3: 1395.888 KB
----------------------------------------
widgetsnbextension 3.5.1: 4609.962 KB
----------------------------------------
webencodings 0.5.1: 54.768 KB
----------------------------------------
wcwidth 0.2.5: 452.214 KB
----------------------------------------
uvicorn 0.14.0: 257.515 KB
----------------------------------------
tzlocal 2.1: 67.11 KB
----------------------------------------
traitlets 5.0.5: 800.71 KB
----------------------------------------
tqdm 4.61.0: 289.412 KB
----------------------------------------
tornado 6.1: 2898.264 KB

【讨论】:

我喜欢这个。我为我做了一些修改(例如,KB 到 MB,按字母排序),这很有帮助。【参考方案6】:

方法如下,

    pip3 show numpy | grep "Location:" 这将返回 path/to/all/packages du -h path/to/all/packages 最后一行将包含所有包的大小(以 MB 为单位)

注意-你可以用任何包名代替 numpy

【讨论】:

【参考方案7】:

历史:

目前没有为此目的开发的命令或应用程序,我们需要手动检查

手动方法一:

du /usr/lib/python3.5/ --max-depth=2 | sort -h
du /usr/lib64/python3.5/ --max-depth=2 | sort -h

这不包括从该目录安装的包/文件,因此说我们将通过这 2 个简单命令获得 95%

另外如果你安装了其他版本的python,需要适配目录

手动方法二:

pip list | sed '/Package/d' | sed '/----/d' | sed -r 's/\S+//2' | xargs pip show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - - | awk 'print $2 "/" $(find $2 -maxdepth 1 -iname $1)' | xargs du -sh  | sort -h

使用不区分大小写的包名搜索安装目录

手动方法二替代一:

pip list | sed '/Package/d' | sed '/----/d' | sed -r 's/\S+//2' | xargs pip show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - -| awk 'print $2 "/" tolower($1)' | xargs du -sh | sort -h

用小写的包名搜索安装目录

手动方法二替代二:

pip list | sed '/Package/d' | sed '/----/d' | sed -r 's/\S+//2' | xargs pip show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - -| awk 'print $2 "/" $1' | xargs du -sh | sort -h

使用包名搜索安装目录

注意:

对于使用du的方法,需要手动检查以du: cannot access开头的输出行; 该命令使用安装目录并在其中添加包名,但有时包名和目录名不同...

简单:

然后使用第一种方法 使用第二种方法,只需手动检查 python 经典目录之外的包

【讨论】:

【参考方案8】:

上述所有解决方案都没有列出包含 破折号 的包:PIP 将它们转换为文件夹名称中的下划线:

pip list --format freeze | awk -F = 'print $1' | xargs pip show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - - | awk 'gsub("-","_",$1); print $2 "/" tolower($1)' | xargs du -sh 2> /dev/null | sort -h

对于 Mac 用户:

pip3 list --format freeze | awk -F = 'print $1' | xargs pip3 show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - - | awk 'gsub("-","_",$1); print $2 "/" tolower($1)' | xargs du -sh 2> /dev/null | sort -h

【讨论】:

【参考方案9】:

如何

 $ du -h -d 1 "$(pip -V | cut -d ' ' -f 4 | sed 's/pip//g')" | grep -vE "dist-info|_distutils_hack|__pycache__" | sort -h

优点

无需转换这些: 案例 (Django:django) 连字符 (django-q:django_q) 命名(djangorestframework-gis:rest_framework_gis)

缺点

依赖关系和一些未知目录也暴露了......

【讨论】:

【参考方案10】:

您可以自己运行第 1 部分,以获取所有当前软件包 python tool-size.py 将为您汇总它们

如果您想知道特定 pip 包的确切大小,包括其所有依赖项,我创建了一个小 bash 和 python 组合来实现这一点

(基于上面的优秀包裹行走代码答案https://***.com/a/67914559/3248788)

步骤:

    创建一个 python 脚本来检查所有当前安装的 pip 包 创建一个shell脚本来创建一个全新的python环境并安装包进行测试,并从步骤1运行脚本 运行shell脚本 利润 :)

第一步

创建一个名为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

第三步

运行你想要的包大小的脚本

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

【讨论】:

以上是关于如何查看安装的 pip 包大小?的主要内容,如果未能解决你的问题,请参考以下文章

怎么查看python中已安装的包

python中如何安装SciPY模块

ubuntu 如何查看安装了哪些包

windows下如何安装pip以及如何查看pip是否已经安装成功?

windows下如何安装pip以及如何查看pip是否已经安装成功

如何查看所有软件包何时使用 pip 安装?