什么是Python蛋caching(PYTHON_EGG_CACHE)?
我刚刚从我的开发机器上从Python 2.6.1升级到2.6.4,启动python脚本时出现以下消息:
无法将文件提取到蛋caching
尝试将文件提取到Python蛋caching时出现以下错误:
[Errno 13] Permission denied:'/var/www/.python-eggs'
Python蛋caching目录目前被设置为:
/var/www/.python-eggs
也许你的帐户没有这个目录的写权限? 您可以通过设置PYTHON_EGG_CACHE环境variables指向一个可访问的目录来更改caching目录。
python文档里没有任何东西,所以我在关于把这个目录放在哪里以及它被用于什么的最佳实践方面有些不知所措。
有人可以解释什么是Python蛋caching?
另外,你能解释为什么/它是如何不同Python的site-packages
目录存储鸡蛋(据我了解)?
从我的调查中发现,一些鸡蛋被打包成zip文件,并保存在Python的site-packages
目录中。
这些压缩的鸡蛋在被执行之前需要解压缩,因此被扩展到PYTHON_EGG_CACHE
目录,默认是~/.python-eggs
(位于用户的主目录)。 如果这不存在,则在尝试运行应用程序时会导致问题。
有一些修复:
- 在用户的主目录中创build一个
.python-eggs
目录并将其设置为可写。 - 创build一个解压缩的全局目录(例如
/tmp/python-eggs
),并设置环境variablesPYTHON_EGG_CACHE
到这个目录。 - 使用
easy_install
在安装时解压缩包时使用-Z
开关。
python egg cache是一个简单的目录,它被setuptools用来存储符合egg规范的软件包。 你可以在这里阅读关于setuptools的更多信息 。
此外,如错误消息所示,您可以通过设置PYTHON_EGG_CACHE = / some / other / dir来在您的环境中指定一个不同的蛋caching目录。 最简单的方法是将其设置在〜/ .bash_profile(假设你正在使用bash)中,如下所示:
export PYTHON_EGG_CACHE=/some/other/dir
如果您使用的是Web应用程序,则可能需要将其设置在Apache环境中。
这是使用其他不错的鸡蛋机制的黑暗副作用。
鸡蛋是打包成一个.egg
文件的软件包(一个充满文件的目录),以简化.egg
。
它们存储在/site-packages/
dir中。
只要存储在鸡蛋中的文件都是.py
文件,那么效果很好。 Python导入可以像任何普通文件一样从任何类似文件的对象导入东西。
但是,当像.so
这样的东西恰好落在那里时,python就无法向底层操作系统解释它想要加载一个没有物理名称的库。 唯一的解决方法distutils作者认为是解压缩到一个临时目录。 当然,它不是/site-packages/
因为/site-packages/
对于普通用户是不可写的。
所以你也可以
-
将
PYTHON_EGG_DIR
设置为/tmp
或 -
给用户
www
写入权限/var/www/.python-eggs
(这样每次清理/ tmp文件都不会被解压) 或者更好 -
按照@ shalley303的build议解压缩蛋
(并且避免在运行时间内解开鸡蛋)。
安装后,您也可以禁用.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
Python鸡蛋是包含Python模块和元数据的压缩包。 鸡蛋caching是鸡蛋提取内容的存储位置,以便包含在内的Python模块可用。
菲利普B奥德姆的权利。 您可以在代码中添加这些行:
import os os.environ['PYTHON_EGG_CACHE'] = '/tmp' # a writable directory