什么是Python egg缓存(PYTHON_EGG_CACHE)?

76 投票
9 回答
73077 浏览
提问于 2025-04-15 18:50

我刚刚把我的开发机器上的Python从2.6.1升级到了2.6.4,结果在启动一个Python脚本时,看到以下信息:

无法将文件提取到egg缓存

在尝试将文件提取到Python的egg缓存时,发生了以下错误:

[Errno 13] 权限被拒绝: '/var/www/.python-eggs'

当前Python的egg缓存目录设置为:

/var/www/.python-eggs

可能是你的账户没有权限写入这个目录?你可以通过设置PYTHON_EGG_CACHE环境变量,来更改缓存目录,指向一个可以访问的目录。

Python文档中没有找到相关内容,所以我对这个目录应该放在哪里以及它的用途有点困惑。

有人能解释一下什么是Python的egg缓存吗?

另外,能不能解释一下它和Python用来存放egg的site-packages目录有什么不同(据我了解)?

9 个回答

14

这是使用很不错的 eggs 机制时出现的一个不太好的副作用。

Eggs 是一种打包方式,把一堆文件放在一个 .egg 文件里,这样可以简化部署过程。

这些文件会存放在 /site-packages/ 这个目录里。

只要这些存放在 egg 里的文件都是 .py 文件,使用起来就没问题。Python 的导入功能可以像对待普通文件一样,从任何类似文件的对象中导入内容。

但是,如果里面出现了像 .so 这样的文件,Python 就无法告诉操作系统它想加载一个没有实际名称的库。为了应对这个问题,distutils 的作者们想到的唯一解决办法就是把它解压到一个临时目录里。自然,这个临时目录不能是 /site-packages/,因为普通用户是不能在这个目录里写东西的。

所以你可以选择:

  • PYTHON_EGG_DIR 设置为 /tmp或者

  • 给用户 www/var/www/.python-eggs 目录下写权限
    (这样就不会每次清理 /tmp 时都解压文件)或者更好的是

  • 按照 @shalley303 的建议解压 egg
    (并且在运行时完全避免解压 egg)。

30

Python的egg缓存其实就是一个文件夹,用来存放符合egg规范的安装包,这些包是通过setuptools这个工具安装的。想了解更多关于setuptools的内容,可以点击这里

另外,正如错误信息所说,你可以通过设置PYTHON_EGG_CACHE=/some/other/dir来指定一个不同的egg缓存目录。最简单的方法是在你的~/.bash_profile文件中设置(假设你在使用bash),可以这样做:

export PYTHON_EGG_CACHE=/some/other/dir

如果你在使用Web应用程序,可能还需要在Apache环境中进行设置。

69

经过我的调查发现,有些“蛋”(这里指的是Python的包)是以压缩文件的形式打包的,并且保存在Python的 site-packages 目录里。

这些压缩的“蛋”在执行之前需要先解压,所以它们会被解压到 PYTHON_EGG_CACHE 目录,默认情况下这个目录是 ~/.python-eggs(位于用户的主目录下)。如果这个目录不存在,运行应用程序时就会出现问题。

解决这个问题的方法有几个:

  1. 在用户的主目录下创建一个 .python-eggs 目录,并确保这个目录是可写的。
  2. 创建一个全局的解压目录(比如 /tmp/python-eggs),并将环境变量 PYTHON_EGG_CACHE 设置为这个目录。
  3. 在使用 easy_install 安装时,使用 -Z 选项来解压包。

撰写回答