什么是Python egg缓存(PYTHON_EGG_CACHE)?

Phi*_*ham 71 python 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缓存是什么吗?

另外,你能解释为什么/如何与site-packagesPython用来存储鸡蛋的目录不同(据我所知)?

Phi*_*ham 66

根据我的调查,事实证明有些鸡蛋被打包为zip文件,并在Python的site-packages目录中保存.

这些压缩的鸡蛋需要在执行之前解压缩,因此会扩展到PYTHON_EGG_CACHE默认目录~/.python-eggs(位于用户的主目录中).如果不存在,则在尝试运行应用程序时会导致问题.

有很多修复:

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

  • Python可以访问.zip文件中的文件.它们需要被提取的唯一时间是应用程序想要一个文件名而不是类似于文件的对象用于蛋内的资源(或目录).这通常发生在Web服务器等上. (7认同)
  • 值得一提的是.python-eggs在不向目录添加执行权限的情况下获取umask.没有执行权限就无法访问目录,因此您会收到与上面相同的错误. (2认同)
  • 选项3的+1.今天我误会了几个小时.使用带有-Z选项的easy_install可以在几秒钟内解决我的问题.Easy_install,它不是那么容易. (2认同)

AJ.*_*AJ. 30

python egg缓存只是setuptools用来存储符合egg规范的软件包的目录.您可以在此处阅读有关setuptools的更多信息.

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

export PYTHON_EGG_CACHE=/some/other/dir
Run Code Online (Sandbox Code Playgroud)

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


Ant*_*ins 12

这是使用其他漂亮的鸡蛋机制的黑暗副作用.

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

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

只要存储在egg中的.py文件是文件就可以了.Python导入可以从任何类似文件的对象导入内容,就像它是普通文件一样.

但是,当有类似的.so事情发生在那里时,python无法向底层操作系统解释它想要加载一个没有物理名称的库.作者所想到的唯一解决办法就是将其解压缩为临时目录.当然这不是/site-packages/因为/site-packages/是不可写的普通用户.

所以你也可以

  • 设置PYTHON_EGG_DIR/tmp,

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

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