【问题标题】:"Can't extract file(s) to egg cache" error in GAEGAE 中的“无法将文件提取到鸡蛋缓存”错误
【发布时间】:2014-08-05 12:37:33
【问题描述】:

我有安装了 setuptools 的 Windows 7 和 Python 2.7。

下载 pitz 模块 (easy_install pitz) 后,Google App Engine 停止工作:

bad runtime process port ['']

Traceback (most recent call last):
  File "G:\Program Files (x86)\Google\google_appengine\_python_runtime.py", line 184, in <module>
    _run_file(__file__, globals())
  File "G:\Program Files (x86)\Google\google_appengine\_python_runtime.py", line 180, in _run_file
    execfile(script_path, globals_)
  File "G:\Program Files (x86)\Google\google_appengine\google\appengine\tools\devappserver2\python\runtime.py", line 28, in <module>
    from google.appengine.ext.remote_api import remote_api_stub
  File "G:\Program Files (x86)\Google\google_appengine\google\appengine\ext\remote_api\remote_api_stub.py", line 75, in <module>
    import yaml
  File "G:\Program Files (x86)\Google\google_appengine\lib\yaml-3.10\yaml\__init__.py", line 14, in <module>
    from cyaml import *
  File "G:\Program Files (x86)\Google\google_appengine\lib\yaml-3.10\yaml\cyaml.py", line 5, in <module>
    from _yaml import CParser, CEmitter
  File "C:\Python27\lib\site-packages\pyyaml-3.11-py2.7-win-amd64.egg\_yaml.py", line 7, in <module>
  File "C:\Python27\lib\site-packages\pyyaml-3.11-py2.7-win-amd64.egg\_yaml.py", line 4, in __bootstrap__
  File "C:\Python27\lib\site-packages\pkg_resources.py", line 950, in resource_filename
    self, resource_name
  File "C:\Python27\lib\site-packages\pkg_resources.py", line 1607, in get_resource_filename
    self._extract_resource(manager, self._eager_to_zip(name))
  File "C:\Python27\lib\site-packages\pkg_resources.py", line 1667, in _extract_resource
    manager.extraction_error()
  File "C:\Python27\lib\site-packages\pkg_resources.py", line 996, in extraction_error
    raise err
pkg_resources.ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

  [Error 5] : 'C:\\Users\\Kostr\\AppData\\Roaming\\Python-Eggs\\pyyaml-3.11-py2.7-win-amd64.egg-tmp\\_yaml.pyd'

The Python egg cache directory is currently set to:

  C:\Users\Kostr\AppData\Roaming\Python-Eggs

Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

如何解决这个问题?

【问题讨论】:

  • 你对“C:\Users\Kostr\AppData\Roaming\Python-Eggs”有写权限吗?
  • 是的。此文件夹包含“pyyaml-3.11-py2.7-win-amd64.egg-tmp”目录和“_yaml.pyd”文件
  • 你试过以管理员身份运行吗?
  • 是的,这并不能解决问题

标签: python google-app-engine python-2.7 python-egg-cache


【解决方案1】:

来自:https://code.google.com/p/modwsgi/wiki/ApplicationIssues

为避免这个特殊问题,您可以在 WSGI 应用程序脚本文件的开头设置 PYTHON_EGG_CACHE 缓存环境变量。环境变量应设置为运行 Apache 的用户拥有和/或可写的目录。

import os
os.environ['PYTHON_EGG_CACHE'] = '/usr/local/pylons/python-eggs' 

再次确保它存在。对于 Windows 用户,可能类似于:

os.environ['PYTHON_EGG_CACHE'] = '/tmp'

或者,如果使用 mod_wsgi 2.0,也可以将 WSGIPythonEggs 指令用于在嵌入式模式下运行的应用程序,或者在使用守护程序模式时使用 WSGIDaemonProcess 指令的 python-eggs 选项。

请注意,您应该避免使用任何人都可以写的目录或文件,因为这可能会危及安全性。还要注意,如果在同一个 Web 服务器下托管多个应用程序,它们都将以同一个用户身份运行,因此每个应用程序都可以查看和修改彼此的文件。如果这是一个问题,您应该将应用程序托管在作为不同用户或不同系统运行的不同 Web 服务器上。或者,应用程序需要或更新的任何数据都应托管在数据库中,每个应用程序都有单独的帐户。

【讨论】:

  • 我在我的应用程序目录中创建了“tmp”文件夹,并将“os.environ['PYTHON_EGG_CACHE'] = '/tmp'”字符串添加到我的 python 文件中。但这并不能解决问题。错误输出甚至没有变化
  • 真的吗? The Python egg cache directory is currently set to: 之后的日志说了什么?您是否以管理员身份登录? '/tmp' 是否存在,您是否有写入权限?
  • 它仍然是“C:\Users\Kostr\AppData\Roaming\Python-Eggs”。我手动创建了“/tmp”文件夹并有权编写它
  • 所以,PYHTON_EGG_CACHE 的设置不起作用。我提供的代码位于 WSGI 应用程序脚本文件的顶部。你把它放在哪里了?我还注意到您将程序拆分为 2 个硬盘驱动器(G: 和 C:)。您可能需要使用绝对路径,以确保它位于正确的驱动器上。尝试记录 os.environ.get('PYTHON_EGG_CACHE') 以查看它的设置位置。
  • “WSGI 脚本文件”是指我的应用程序的 main.py 文件吗?在启动 cmets 后,我将 "import os os.environ['PYTHON_EGG_CACHE'] = '/tmp'" 放在该文件的顶部。我在“C:”光盘上安装了 Python27,我的项目在“G:”光盘上。
【解决方案2】:

听起来您没有写入目录的权限。卸载 pitz,然后使用 -Z 标签重新安装以将其安装为解压缩版本。然后,您不需要每次都提取缓存目录。这应该可以解决目录/权限问题。

【讨论】:

  • 如何卸载 pitz?我尝试“easy_install -m pitz”,然后从“C:\Python27\Lib\site-packages”和“C:\Python27\Scripts”文件夹中手动删除所有 pitz 文件。然后我运行“easy_install -Z pitz”,但毕竟,我得到了同样的错误
  • 这是 pyyaml 造成的,而不是 pitz。卸载 pyyaml 并使用 -Z 重新安装
  • 这种方法解决了我的问题。我确实使用 pip 卸载了 pyyaml,然后使用 easy_install -z pyyaml 安装了它。
猜你喜欢
  • 2018-03-12
  • 2014-10-19
  • 2011-01-12
  • 2017-06-25
  • 2017-02-28
  • 2017-03-08
  • 2014-01-16
  • 2021-03-25
  • 1970-01-01
相关资源
最近更新 更多