75

我刚刚在我的开发机器上从 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 的鸡蛋缓存是什么吗?

另外,你能解释一下它为什么/如何与site-packagesPython 用来存储鸡蛋的目录不同(据我了解)吗?

4

9 回答 9

69

根据我的调查,有些鸡蛋被打包为 zip 文件,并保存在 Python 的site-packages目录中。

这些压缩的鸡蛋在执行之前需要解压缩,所以会展开到PYTHON_EGG_CACHE默认的目录中~/.python-eggs(位于用户的主目录中)。如果这不存在,则在尝试运行应用程序时会导致问题。

有许多修复:

  1. 在用户的主目录中创建一个.python-eggs目录,并使其对用户可写。
  2. 创建一个用于解压缩的全局目录(例如。/tmp/python-eggs)并将环境变量PYTHON_EGG_CACHE设置为该目录。
  3. 安装时使用使用时的-Z开关easy_install解压包。
于 2010-02-03T17:03:15.030 回答
30

python egg 缓存只是 setuptools 用来存储符合egg 规范的安装包的目录。您可以在此处阅读有关 setuptools 的更多信息

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

export PYTHON_EGG_CACHE=/some/other/dir

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

于 2010-02-03T13:56:10.543 回答
14

这是使用其他不错的鸡蛋机制的黑暗副作用。

Eggs 是打包到一个.egg文件中以简化分解的包(一个充满文件的目录)。

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

只要存储在 egg 中的文件是.py文件,它就可以很好地工作。Python import 可以从任何类似文件的对象中导入东西,就像它是一个普通文件一样。

但是当类似的.so事情发生在那里时,python 无法向底层操作系统解释它想要加载一个没有物理名称的库。distutils 作者想到的唯一解决方法是将其解压缩到临时目录中。自然不是/site-packages/因为/site-packages/普通用户不可写。

所以你可以

  • 设置PYTHON_EGG_DIR/tmp,

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

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

于 2012-08-14T18:29:31.923 回答
3

Python 鸡蛋是包含 Python 模块和元数据的 zip 压缩包。鸡蛋缓存是存储提取的鸡蛋内容的地方,以便其中包含的 Python 模块可用。

于 2010-02-03T14:15:17.190 回答
3

您还可以在安装 .egg 后禁用它。您需要进入站点包目录,提取 .egg,然后将其移动到隐藏文件(或删除它,或其他)。

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

cd /usr/local/lib/python2.7/site-packages
解压 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
于 2012-04-04T19:53:39.487 回答
1

菲利普 B 奥尔德姆是对的。您可以在代码中添加这些行:

import os  
os.environ['PYTHON_EGG_CACHE'] = '/tmp' # a writable directory 
于 2017-02-08T03:36:17.883 回答
0

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

$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs
于 2018-01-25T22:02:58.963 回答
0

第一次运行以下命令时,我在 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.)
于 2019-10-15T19:09:21.173 回答
0

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

import os
xyz = os.path.join('~', 'Documents', '.cache')
os.environ['PYTHON_EGG_CACHE'] = os.path.expanduser(xyz)
于 2021-07-28T10:53:45.983 回答