什么是Python egg缓存(PYTHON_EGG_CACHE)?
我刚刚把我的开发机器上的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的egg缓存吗?
另外,能不能解释一下它和Python用来存放egg的site-packages
目录有什么不同(据我了解)?
9 个回答
这是使用很不错的 eggs 机制时出现的一个不太好的副作用。
Eggs 是一种打包方式,把一堆文件放在一个 .egg
文件里,这样可以简化部署过程。
这些文件会存放在 /site-packages/
这个目录里。
只要这些存放在 egg 里的文件都是 .py
文件,使用起来就没问题。Python 的导入功能可以像对待普通文件一样,从任何类似文件的对象中导入内容。
但是,如果里面出现了像 .so
这样的文件,Python 就无法告诉操作系统它想加载一个没有实际名称的库。为了应对这个问题,distutils 的作者们想到的唯一解决办法就是把它解压到一个临时目录里。自然,这个临时目录不能是 /site-packages/
,因为普通用户是不能在这个目录里写东西的。
所以你可以选择:
把
PYTHON_EGG_DIR
设置为/tmp
,或者给用户
www
在/var/www/.python-eggs
目录下写权限
(这样就不会每次清理/tmp
时都解压文件)或者更好的是按照 @shalley303 的建议解压 egg
(并且在运行时完全避免解压 egg)。
经过我的调查发现,有些“蛋”(这里指的是Python的包)是以压缩文件的形式打包的,并且保存在Python的 site-packages
目录里。
这些压缩的“蛋”在执行之前需要先解压,所以它们会被解压到 PYTHON_EGG_CACHE
目录,默认情况下这个目录是 ~/.python-eggs
(位于用户的主目录下)。如果这个目录不存在,运行应用程序时就会出现问题。
解决这个问题的方法有几个:
- 在用户的主目录下创建一个
.python-eggs
目录,并确保这个目录是可写的。 - 创建一个全局的解压目录(比如
/tmp/python-eggs
),并将环境变量PYTHON_EGG_CACHE
设置为这个目录。 - 在使用
easy_install
安装时,使用-Z
选项来解压包。