PAYATHON 2026

如何减小 Python 虚拟环境体积,并复用系统安装的 Django 等依赖?

数据阿明

可以。Python 的 venv 和 virtualenv 都支持使用 --system-site-packages 访问系统安装的包。如果系统已有符合项目要求的 Django 等依赖,就有可能减少虚拟环境中的重复安装。

能节省多少空间,取决于系统已安装哪些包、版本是否满足要求,以及托管平台如何计算磁盘配额。只创建符号链接或更换虚拟环境工具,不能保证降低总磁盘用量。

先确认空间实际用在哪里

问题中报告的虚拟环境体积约为 446 MB,网站代码、媒体和静态图片合计约为 49 MB。这两部分大小没有固定比例:虚拟环境还包括框架、第三方库及其依赖,应用代码少,环境也不一定小。

Django 约 49 MB、Google Drive API 相关依赖约 94 MB,是当前环境中的统计结果,并非所有环境都一样。还需确认统计范围是单个包目录,还是包含了关联依赖。

在 Linux 托管环境中,先激活现有环境,然后检查:

python -c "import sys; print(sys.executable); print(sys.prefix)"
du -sh "$VIRTUAL_ENV"
du -h "$VIRTUAL_ENV" | sort -h | tail -n 20
python -m pip list

$VIRTUAL_ENV 通常由激活脚本设置。目录统计可以帮助判断空间主要被哪些包、缓存或其他文件占用;pip list 用来查看安装清单,不提供包的磁盘占用。

使用受支持的方式共享系统包

使用与项目兼容的 Python 解释器创建新环境:

python3 -m venv --system-site-packages .venv-shared
source .venv-shared/bin/activate

如果使用的是 virtualenv:

virtualenv --system-site-packages .venv-shared

选择其中一种方式即可。这里的 python3 或 virtualenv 应对应项目需要的 Python 版本。

启用后,环境可以访问对应解释器的系统包。正常执行 pip install 时,已经可见且满足版本约束的包通常不需要在虚拟环境中再安装一份;如果版本不满足要求,pip 仍可能在虚拟环境中安装另一个版本。

例如,项目要求固定的 Django 版本,而系统提供的是其他版本,就无法通过共享来省掉这部分安装空间。

可以检查实际导入位置:

python -c "import django; print(django.get_version()); print(django.__file__)"
python -m pip list --local

第一条命令显示 Django 的版本和导入路径;第二条命令在启用系统包共享的环境中列出本地安装的包。

已有的 venv 也可以通过 pyvenv.cfg 中的配置开启共享:

include-system-site-packages = true

修改配置不会自动删除环境中已有的依赖,目录也不会自动缩小。为了方便核对依赖来源,通常更适合新建环境,验证后再替换旧环境。

整理生产环境真正需要的依赖

先记录当前环境的依赖:

python -m pip freeze > requirements-current.txt

这份文件可供回查安装状态,无法自动判断网站运行需要哪些包。检查时要结合项目的依赖声明和实际功能,留意测试工具、调试工具、交互式开发工具,以及已停用功能的依赖。

把确认后的生产依赖放入 requirements.txt,再在新环境中安装:

python -m pip install -r requirements.txt

不要因为不熟悉包名就卸载,也不要只保留代码中直接 import 的包。Django、WeasyPrint 和 Google Drive API 客户端可能需要间接依赖。

如果系统已经提供满足要求的依赖,共享环境可以直接使用;缺少的部分仍需安装。若将同样的包安装到自己账户下的另一个目录来共享,而该目录仍计入同一磁盘配额,总占用未必会减少。

单独检查 pip 缓存

pip 缓存通常位于虚拟环境目录之外。清理它可能释放账户空间,但一般不会减少虚拟环境目录本身的体积:

python -m pip cache info
python -m pip cache purge

清理缓存不会卸载已安装的包,但之后重新安装时可能需要再次下载。如果只是不希望本次安装写入缓存,可以使用:

python -m pip install --no-cache-dir -r requirements.txt

这也不会缩小依赖安装后的文件大小。

不建议手动链接或删除包内部文件

在 site-packages 中手动建立符号链接,满足兼容条件时可能可行,但需要自行维护包目录、发行版元数据和可能存在的二进制扩展。一旦共享位置变更或被删除,网站可能无法运行。

如果是为了复用系统包,优先使用 --system-site-packages。venv --symlinks 主要控制 Python 可执行文件等环境文件的链接方式,不会自动共享全部第三方依赖。

也不要直接删除第三方包的数据目录来压缩体积。API 客户端可能需要接口描述文件,PDF 生成相关库也可能依赖运行时资源。目录看起来不像代码,并不代表可以安全删除。

替换环境前验证关键功能

共享系统包会降低环境的独立性。系统包升级、移除或版本变化都可能影响网站。如果托管平台不允许控制这些包,能节省多少空间就受平台提供的依赖限制。

切换前,至少检查 Django 项目配置、页面访问、WeasyPrint 的 PDF 生成功能,以及实际使用的 Google Drive API 调用。确认新环境可用后,再调整网站的环境路径并移除旧环境;新旧环境并存期间还需要预留额外磁盘空间。

建议先查出最大的目录,再确认系统是否已有兼容的依赖。如果系统有兼容依赖,--system-site-packages 是复用系统安装包的标准方式。

备注:内容仅供参考。