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

无法将文件提取到 Egg 缓存

试图将文件提取到Python Egg Cache时发生以下错误:

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

Python Egg Cache Directory目前设置为:

/var/www/.python-eggs

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

里面没有任何东西 蟒蛇文档 所以我对于放置此目录的位置及其用途的最佳实践有点茫然。

有人能解释一下Python的egg缓存是什么吗?

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

有帮助吗?

解决方案

根据我的调查,一些鸡蛋被打包为 zip 文件,并以这种方式保存在 Python 中 site-packages 目录。

这些带拉链的鸡蛋在执行之前需要先解压,因此被扩展为 PYTHON_EGG_CACHE 默认目录是 ~/.python-eggs (位于用户的主目录中)。如果不存在,则会在尝试运行应用程序时出现问题。

有许多修复:

  1. 创建一个 .python-eggs 目录并使其对用户可写。
  2. 创建一个用于解压的全局目录(例如 /tmp/python-eggs)并设置环境变量 PYTHON_EGG_CACHE 到这个目录。
  3. 使用 -Z 使用时切换 easy_install 安装时解压包。

其他提示

在蟒蛋高速缓存仅仅是由setuptools的安装到存储软件包符合蛋说明书中使用一个目录。您可以阅读更多关于setuptools的这里

此外,作为错误消息状态,你可以通过设置PYTHON_EGG_CACHE = /一些/其它/ DIR指定在您的环境不同的鸡蛋缓存目录。要做到这一点,最简单的方法是设置它在你的〜/ .bash_profile中(假设你使用bash),像这样的:

export PYTHON_EGG_CACHE=/some/other/dir

您可能需要如果你使用一个Web应用程序来设置它在你的Apache环境。

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

Eggs 是打包成一个包(一个充满文件的目录) .egg 文件以简化部署。

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

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

但是当类似的事情 .so 碰巧落入其中,python 无法向底层操作系统解释它想要加载一个没有物理名称的库。distutils 作者想到的唯一解决方法是将其解压缩到临时目录中。自然不是 /site-packages/ 自从 /site-packages/ 普通用户不可写。

所以你可以

  • PYTHON_EGG_DIR/tmp, 或者

  • 给用户 www 写权限给 /var/www/.python-eggs
    (这样每次清理 /tmp 时文件就不会被解压缩) 或者更好

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

的Python蛋是ZIP压缩的含有Python模块和元数据封装。蛋缓存是其中蛋的所提取的内容被存储,使得Python模块包含在是可用的。

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

下面是我所做禁用时Python脚本正在从的zabbix运行哪个造成这个错误的MySQLdb的模块.egg文件的示例。

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

菲利普乙欧氏右。您可以在代码中添加这些行:

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

一个简单的解决将是创建目录,并提供给它www-data访问。

$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top