什么是Python egg缓存(PYTHON_EGG_CACHE)?

时间:2010-02-03 13:50:10

标签: python python-egg-cache

我刚刚在我的开发机器上从Python 2.6.1升级到2.6.4,并在启动python脚本时显示以下消息:

  

无法将文件提取到egg cache

     

发生以下错误   试图将文件提取到   Python egg cache:

     

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

     

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

     

/var/www/.python-eggs

     

也许您的帐户没有   写访问该目录?您   可以通过更改缓存目录   设置PYTHON_EGG_CACHE   环境变量指向一个   可访问的目录。

python docs中没有任何内容,所以关于放置此目录的位置及其用途的最佳做法,我有点不知所措。

有人可以解释一下Python egg缓存是什么吗?

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

9 个答案:

答案 0 :(得分:66)

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

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

有许多修复方法:

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

答案 1 :(得分:30)

python egg cache只是setuptools用来存储符合egg specification的软件包的目录。你可以read more about setuptools here

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

export PYTHON_EGG_CACHE=/some/other/dir

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

答案 2 :(得分:12)

使用其他漂亮的鸡蛋机制这是一个黑暗的副作用。

鸡蛋是打包到一个.egg文件中的包(一个充满文件的目录),以简化解除。

它们存储在/site-packages/ dir。

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

但是当.so之类的东西碰到那里时,python无法向底层操作系统解释它想要加载一个没有物理名称的库。作者所想到的唯一解决办法就是将其解压缩为临时目录。当然它不是/site-packages/,因为普通用户/site-packages/不可写。

所以你可以

  • PYTHON_EGG_DIR设为/tmp

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

您也可以在安装后禁用.egg。您需要进入site-packages目录,解压缩.egg,然后将其移动到隐藏文件(或删除它,或其他任何内容)。

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

第一次运行以下命令时,我在Django中遇到此错误。

getPercentInstance

我让它像这样工作:

NumberFormat

答案 8 :(得分:0)

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

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