我刚刚在我的开发机器上从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
目录不同(据我所知)?
答案 0 :(得分:66)
根据我的调查结果发现,有些鸡蛋被打包为zip文件,并在Python的site-packages
目录中保存。
这些压缩的鸡蛋需要在执行之前解压缩,因此会扩展到PYTHON_EGG_CACHE
目录,默认情况下为~/.python-eggs
(位于用户的主目录中)。如果不存在,则在尝试运行应用程序时会导致问题。
有许多修复方法:
.python-eggs
目录,并使其可供用户写入。/tmp/python-eggs
)并将环境变量PYTHON_EGG_CACHE
设置为此目录。-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)