什么是 PYTHON 卵缓存(PYTHON_EGG_CACHE) ?

我刚刚在自己的开发机器上从 Python 2.6.1升级到2.6.4,在启动一个 Python 脚本时,出现了以下消息:

无法将文件提取到 egg 缓存

时发生下列错误 试图将文件解压缩到 巨蟒卵缓存:

拒绝批准: “/var/www/. python-egg”

Python egg 缓存目录是 目前设定为:

/var/www/. python-egg

也许你的帐户没有 写入这个目录的访问权限 可以通过以下方法更改缓存目录 设定 PYTHON _ EGG _ CACHE 环境变量 可访问的目录。

巨蟒文档中没有任何内容,所以关于将这个目录放在哪里以及它用于什么方面的最佳实践,我有点迷茫。

有人能解释一下巨蟒卵子库是什么吗?

另外,您能否解释一下为什么/如何不同于 Python 用来存储鸡蛋的 site-packages目录(据我所知) ?

71122 次浏览

Pythonegg 缓存只是 setuptools 用来存储所安装的符合 鸡蛋规格说明书的包的一个目录。你可以 点击这里阅读更多关于 setuptools 的信息

此外,如错误消息所述,您可以通过设置 PYTHON _ EGG _ CACHE =/some/other/dir 在您的环境中指定不同的 egg 缓存目录。最简单的方法是把它设置在你的 ~/中。Bash _ profile (假设您正在使用 bash) ,如下所示:

export PYTHON_EGG_CACHE=/some/other/dir

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

Python egg 是包含 Python 模块和元数据的压缩包。Egg 缓存是提取的 egg 内容存储的地方,这样包含在其中的 Python 模块就可以使用了。

根据我的调查,一些 egg 被打包为 zip 文件,并以这种方式保存在 Python 的 site-packages目录中。

这些压缩过的 egg 需要在执行之前解压缩,因此需要扩展到 PYTHON_EGG_CACHE目录,默认情况下该目录是 ~/.python-eggs(位于用户的主目录中)。如果不存在这种情况,则在尝试运行应用程序时会出现问题。

有许多补救措施:

  1. 在用户的主目录中创建一个 .python-eggs目录,并使其可供用户写入。
  2. 为解压缩创建一个全局目录(如 /tmp/python-eggs) ,并将环境变量 PYTHON_EGG_CACHE设置为此目录。
  3. 使用 easy_install时使用 -Z开关在安装时解压缩包。

还可以禁用。鸡蛋安装后。您需要进入 site-package 目录,解压缩。然后将其移动到一个隐藏文件(或删除它,或其他)。

下面是我禁用 MySQLdb 模块的示例。在从 Zabbix 运行 python 脚本时导致此错误的 egg 文件。

cd /usr/local/lib/python2.7/site-packages
unzip MySQL_python-1.2.3-py2.7-linux-x86_64.egg
mv MySQL_python-1.2.3-py2.7-linux-x86_64.egg .MySQL_python-1.2.3-py2.7-linux-x86_64.egg

这是使用其他好鸡蛋机制的阴暗副作用。

Eggs 是打包到一个 .egg文件中的包(一个包含很多文件的目录) ,以简化解除操作。

它们存储在 /site-packages/目录中。

只要存储在鸡蛋里的文件是 .py文件,它就能很好地工作。Python 导入可以像导入普通文件一样从任何类似文件的对象导入内容。

但是当像 .so这样的东西碰巧出现时,python 无法向底层操作系统解释它想要加载一个没有物理名称的库。而且 distutils 作者想到的唯一变通方法是将其解压缩到临时目录中。自然,它不是 /site-packages/,因为 /site-packages/不能写入普通用户。

所以你也可以

  • 设置 PYTHON_EGG_DIR/tmp或者

  • 授予用户 www/var/www/.python-eggs的写权限
    (这样就不会在每次清理/tmp 时解压缩文件) 或者更好

  • 按照@shalley303的建议解压缩鸡蛋
    (并避免在运行时完全解压鸡蛋)

Phillip B Oldham 是对的。您可以在代码中添加以下代码行:

import os
os.environ['PYTHON_EGG_CACHE'] = '/tmp' # a writable directory

一个简单的修复方法是创建目录并提供对它的 www-data访问。

$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs

在第一次运行以下命令时,我在 Django 中得到了这个错误。

python manage.py sql myproject

我让它这样工作:

1. In Explorer, view the folder that the error says egg cache directory is set to
2. Delete (or rename) the file mysql_python-1.2.5-py2.7-win32.egg-tmp
3. That's it. The command now works and creates a new file in there. (Haven't tested if I need to do this every time.)

在任何导入工作之前,在源文件的开头添加这个

import os
xyz = os.path.join('~', 'Documents', '.cache')
os.environ['PYTHON_EGG_CACHE'] = os.path.expanduser(xyz)