【问题标题】:How to determine the size of a non-installed python package?如何确定未安装的python包的大小?
【发布时间】:2014-08-30 21:15:15
【问题描述】:

我没有太多空间了,我很想安装python库。

我想在安装之前知道一个 python 库有多大(只是想知道如果我没有足够的空间需要多少额外的空间)。

有没有办法做到这一点,例如使用pip?

【问题讨论】:

    标签: python pip


    【解决方案1】:

    据我所知,使用pip 是不可能的。但如果包托管在 PyPI 上,您可以将 /json 附加到 URL 以查看更多详细信息,包括文件大小。

    例如,访问https://pypi.python.org/pypi/pip/json 并查看releases 键中的条目。每个版本的size 告诉您下载量有多大。

    请注意,这告诉您的是下载大小,而不是安装后的大小(因为软件包可能会要求安装其他依赖项,解压缩档案后等等)。因此,在安装之前,您的问题可能难以回答。

    【讨论】:

      【解决方案2】:

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

      (基于来自How to see pip package sizes installed? 的优秀包遍历代码)

      步骤:

      1. 创建一个 python 脚本来检查所有当前安装的 pip 包
      2. 创建一个shell脚本来创建一个全新的python环境并安装包进行测试
      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
      
      
      

      【讨论】:

      • 这个工具不会下载所有这些包来确定大小吗?如果您没有剩余空间,那将不会很有帮助。
      • 原以为你会在不同的非空间受损机器上运行它:) 这样糟糕的服务器/嵌入式设备不需要使用任何空间
      • 激活和停用在运行脚本时不起作用。 ./tool-size.sh: line 8: ~/.virtualenvs/tool-size-tester/Scripts/activate: No such file or directory./tool-size.sh: line 11: deactivate: command not found
      【解决方案3】:

      如果您有 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
      

      【讨论】:

      • 在 OSX 上,此脚本无法正常工作,直到我将两个 paste -sd+ 更改为 paste -s -d '+' -,然后在运行时将我机器上所有库的大小相加。放置一个空白的 requirements.txt 文件也是如此。
      • 逐一尝试该行中的命令,看看它与Linux的不同之处
      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 2016-03-19
      • 2017-02-21
      • 1970-01-01
      • 2015-05-13
      • 2022-11-22
      • 2022-12-31
      • 2013-06-06
      相关资源
      最近更新 更多