什么是Python鸡蛋缓存(PYTHON_EGG_CACHE)?


74

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

无法将文件提取到Egg缓存

尝试将文件提取到Python Egg缓存时发生以下错误:

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

Python鸡蛋缓存目录当前设置为:

/var/www/.python-eggs

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

python文档中没有任何内容,因此我对将目录放在何处以及用于什么目的的最佳实践感到有些茫然。

有人可以解释什么是Python卵缓存吗?

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

Answers:


67

从我的调查中可以看出,有些鸡蛋被打包为zip文件,并以此形式保存在Python的site-packages目录中。

必须先解压缩这些压缩的鸡蛋,然后才能执行它们,因此将其扩展到PYTHON_EGG_CACHE默认情况下~/.python-eggs位于目录中(位于用户的主目录中)。如果不存在,则在尝试运行应用程序时会引起问题。

有许多修复程序:

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

7
Python可以访问.zip文件中的文件。唯一需要提取它们的时间是应用程序需要一个文件名而不是一个鸡蛋内部的资源(或目录)类似文件的对象时。这通常发生在Web服务器等上。
2011年

2
还值得一提的是,.python-eggs可以使用umask而不向目录添加执行权限。没有执行权限就无法访问目录,因此您将收到与上述相同的错误。
约堡2014年

1
我想知道为什么/var/www/.python-eggs默认情况下将其设置为默认值,而不是更标准的位置....
tutuca 2014年

2
选项3的+1。这让我烦了几个小时。使用easy_install和-Z选项可以在几秒钟内解决我的问题。Easy_install,不是那么容易。
丹尼斯·鲍祖斯

30

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

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

export PYTHON_EGG_CACHE=/some/other/dir

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


我解决了谷歌App Engine的web服务器缺少环境变量通过编辑app.yaml的是这样的:env_variables:PYTHON_EGG_CACHE: 'C:\ Python27 \ LIB \站点包' stackoverflow.com/questions/31122337/...
dbasch

12

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

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

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

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

但是,当类似的东西.so掉进那里时,python无法向底层操作系统解释它要加载没有物理名称的库。distutils作者想到的唯一解决方法是将其解压缩到临时目录中。当然,/site-packages/由于/site-packages/普通用户无法写,所以不是这样。

所以你可以

  • 设置PYTHON_EGG_DIR/tmp

  • 授予用户 (以便每次清除/ tmp时都不会解压缩文件)的www写权限,或者更好/var/www/.python-eggs

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


3

您也可以在安装.egg后禁用它。您需要进入site-packages目录,解压缩.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

我不认为你会得到一个.egg与PyODBC,只是一个.egg-info.so
joedborg

这个作品,如果不是移动我MySQL_python-1.2.3-py2.7-linux-x86_64.egg.MySQL_python-1.2.3-py2.7-linux-x86_64.egg我解压后移动EGG-INFO文件MySQL_python-1.2.3-py2.7-linux-x86_64.egg-info
迈克·戴克


1

菲利普·奥德汉(Phillip B Oldham)的权利。您可以在代码中添加以下行:

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


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.)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.