"virtualenv" 中的库比系统库大得多

Libraries in "virtualenv" much bigger than system libraries

我通过 pew 使用 virtualenv(我认为这是一个很棒的工具),但我发现了一些奇怪的东西。

我安装了 scipy 系统端:

    7,7 MiB [##########] /sparse
    5,1 MiB [######    ] /special
    5,1 MiB [######    ] /stats
    5,0 MiB [######    ] /linalg
    3,5 MiB [####      ] /spatial
    3,0 MiB [###       ] /optimize
    2,5 MiB [###       ] /signal
    2,3 MiB [###       ] /interpolate
    2,3 MiB [##        ] /misc
    2,2 MiB [##        ] /io
    1,5 MiB [##        ] /integrate
    1,3 MiB [#         ] /ndimage
    1,0 MiB [#         ] /fftpack
  744,0 KiB [          ] /cluster
  512,0 KiB [          ] /odr
  464,0 KiB [          ] /constants
  252,0 KiB [          ] /_lib
   44,0 KiB [          ] /_build_utils
   36,0 KiB [          ] /__pycache__
   24,0 KiB [          ]  HACKING.rst.txt
   12,0 KiB [          ]  THANKS.txt
    8,0 KiB [          ]  INSTALL.rst.txt
    4,0 KiB [          ]  __init__.py
    4,0 KiB [          ]  __config__.py
    4,0 KiB [          ]  LICENSE.txt
    4,0 KiB [          ]  setup.py
    4,0 KiB [          ]  BENTO_BUILD.txt
    4,0 KiB [          ]  version.py
    4,0 KiB [          ]  linalg.pxd

这是 scipy 安装的 virtualenv 端(相同 scipy 版本):

51,0 MiB [##########] /sparse
   37,6 MiB [#######   ] /.libs
   12,9 MiB [##        ] /linalg
   10,6 MiB [##        ] /spatial
    9,7 MiB [#         ] /special
    6,0 MiB [#         ] /interpolate
    5,9 MiB [#         ] /stats
    5,1 MiB [#         ] /optimize
    4,2 MiB [          ] /signal
    3,2 MiB [          ] /io
    3,0 MiB [          ] /integrate
    3,0 MiB [          ] /ndimage
    2,3 MiB [          ] /misc
    2,1 MiB [          ] /cluster
    1,7 MiB [          ] /fftpack
  884,0 KiB [          ] /odr
  328,0 KiB [          ] /constants
  204,0 KiB [          ] /_lib
   32,0 KiB [          ] /_build_utils
   24,0 KiB [          ]  HACKING.rst.txt
   20,0 KiB [          ] /__pycache__
   12,0 KiB [          ]  THANKS.txt
    8,0 KiB [          ]  INSTALL.rst.txt
    4,0 KiB [          ]  __init__.py
    4,0 KiB [          ]  LICENSE.txt
    4,0 KiB [          ]  setup.py
    4,0 KiB [          ]  __config__.py
    4,0 KiB [          ]  BENTO_BUILD.txt
    4,0 KiB [          ]  version.py
    4,0 KiB [          ]  pip-delete-this-directory.txt
    4,0 KiB [          ]  linalg.pxd

毋庸置疑,尺寸差异很大。它通常不会打扰我,但我正在尝试将一个可执行文件与 pyinstaller 捆绑在一起,而生成的可执行文件太大了,不切实际。

有人可以解释这样的区别吗?它不特定于 scipy,我也看到它用于 numpy,也许用于其他库。

编辑:

目录中的文件大小不同:

全系统:

3,1 MiB [##########]  _sparsetools.cpython-35m-x86_64-linux-gnu.so

Virtualenv-wide:

38,5 MiB [##########]  _sparsetools.cpython-35m-x86_64-linux-gnu.so

为 Scipy 分发的 Python wheels 中的共享库文件没有被删除,所以它们比你的包管理器安装的要大:

$ file _sparsetools.cpython-35m-x86_64-linux-gnu.so
_sparsetools.cpython-35m-x86_64-linux-gnu.so: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=ed7b8e00c558f234620423315fa9b53274393e72, not stripped
$ du -h _sparsetools.cpython-35m-x86_64-linux-gnu.so
39M     _sparsetools.cpython-35m-x86_64-linux-gnu.so

如果strip it,文件大小缩小:

$ strip _sparsetools.cpython-35m-x86_64-linux-gnu.so
$ file _sparsetools.cpython-35m-x86_64-linux-gnu.so
_sparsetools.cpython-35m-x86_64-linux-gnu.so: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=ed7b8e00c558f234620423315fa9b53274393e72, stripped
$ du -h _sparsetools.cpython-35m-x86_64-linux-gnu.so
3.7M    _sparsetools.cpython-35m-x86_64-linux-gnu.so

PyInstaller 可以使用 --strip flag.

为您完成此操作