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

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

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

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

【问题讨论】:

    标签: python linux debian 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】:

    方法如下,

    1. pip3 show numpy | grep "Location:"
    2. 这将返回 path/to/all/packages
    3. du -h path/to/all/packages
    4. 最后一行将包含所有包的大小(以 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://stackoverflow.com/a/67914559/3248788

            步骤:

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

            第一步

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-12-04
              • 2021-12-04
              • 2014-09-04
              • 2020-02-10
              • 2019-07-14
              • 2017-03-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多