GAE Python开发服务器在升级到2.7后间歇性崩溃

GAE Python开发服务器在升级到2.7后间歇性崩溃,python,google-app-engine,Python,Google App Engine,我最近将我的GAE Python应用程序升级到了Python 2.7。从那时起,我定期在dev服务器上遇到以下错误,dev服务器会提供一个空白页: Traceback (most recent call last): File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/googl

我最近将我的GAE Python应用程序升级到了Python 2.7。从那时起,我定期在dev服务器上遇到以下错误,dev服务器会提供一个空白页:

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/runtime/wsgi.py", line 168, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/runtime/wsgi.py", line 206, in _LoadHandler
    handler = __import__(path[0])
  [...]
  File "/Users/joneill/OpenSTV/OpenSTV/trunk/OpaVote-HR/main.py", line 2, in <module>
    import views
  [...]
  File "/Users/joneill/OpenSTV/OpenSTV/trunk/OpaVote-HR/views.py", line 3, in <module>
    from pytz.gae import pytz
  [...]
  File "/Users/joneill/OpenSTV/OpenSTV/trunk/OpaVote-HR/pytz/__init__.py", line 34, in <module>
    from pkg_resources import resource_stream
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 662, in Decorate
    return func(self, *args, **kwargs)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1818, in load_module
    return self.FindAndLoadModule(submodule, fullname, search_path)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 662, in Decorate
    return func(self, *args, **kwargs)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1690, in FindAndLoadModule
    description)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 662, in Decorate
    return func(self, *args, **kwargs)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1615, in LoadModuleRestricted
    return source_file.load_module(submodule_fullname)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist/py_zipimport.py", line 246, in load_module
    submodname, is_package, fullpath, source = self._get_source(fullmodname)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist/py_zipimport.py", line 207, in _get_source
    source = self.zipfile.read(relpath.replace(os.sep, '/'))
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py", line 867, in read
    return self.open(name, "r", pwd).read()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py", line 882, in open
    zef_file = open(self.filename, 'rb')
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 578, in __init__
    raise IOError(errno.EACCES, 'file not accessible', filename)
IOError: [Errno 13] file not accessible: '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg'
INFO     2012-01-21 20:50:44,222 dev_appserver.py:2832] "POST /manage HTTP/1.1" 500 -
回溯(最近一次呼叫最后一次):
文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/runtime/wsgi.py”,第168行,在句柄中
handler=\u config\u handle.add\u wsgi\u中间件(self.\u LoadHandler())
文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/runtime/wsgi.py”,第206行,在LoadHandler中
处理程序=\uuuu导入\uuuu(路径[0])
[...]
文件“/Users/joneill/OpenSTV/OpenSTV/trunk/opadvote HR/main.py”,第2行,在
导入视图
[...]
文件“/Users/joneill/OpenSTV/OpenSTV/trunk/opadvote HR/views.py”,第3行,在
从pytz.gae导入pytz
[...]
文件“/Users/joneill/OpenSTV/OpenSTV/trunk/opavate HR/pytz/_init__.py”,第34行,在
从pkg_资源导入资源_流
文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/tools/dev\u appserver\u import\u hook.py”,第662行
返回函数(self、*args、**kwargs)
文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/tools/dev\u appserver\u import\u hook.py”,第1818行,在加载模块中
返回self.findLoadModule(子模块、全名、搜索路径)
文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/tools/dev\u appserver\u import\u hook.py”,第662行
返回函数(self、*args、**kwargs)
文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/tools/dev\u appserver\u import\u hook.py”,第1690行,位于FindLoadModule中
(说明)
文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/tools/dev\u appserver\u import\u hook.py”,第662行
返回函数(self、*args、**kwargs)
LoadModuleRequired中的文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine/google/appengine/tools/dev_appserver\u import\u hook.py”第1615行
返回源\文件。加载\模块(子模块\全名)
文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/dist/py\u zipimport.py”,第246行,在加载模块中
submodname,是包,完整路径,source=self.\u get\u source(fullmodname)
文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/dist/py\u zipimport.py”,第207行,在获取源代码中
source=self.zipfile.read(relpath.replace(os.sep'/'))
文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py”,第867行,已读
返回self.open(名称“r”,pwd).read()
打开文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py”,第882行
zef_file=open(self.filename,'rb')
文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/tools/dev\u appserver\u import\u hook.py”,第578行,在__
raise IOError(errno.EACCES,“文件不可访问”,文件名)
IOError:[Errno 13]文件不可访问:'/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/setuptools-0.6c11-py2.7.egg'
信息2012-01-21 20:50:44222 dev_appserver.py:2832]“发布/管理HTTP/1.1”500-
一些注意事项:

  • 这不会发生在生产服务器上
  • 在dev服务器上,我的应用程序将运行几分钟,然后发生此错误
  • 如果我在dev服务器上停止并重新启动我的应用程序,它将再次工作几分钟
  • 我使用的是最新版本的,您可以看到它在导入时失败
  • 我删除的[…]与您在结尾处看到的内容类似
  • 我不知道为什么最后会调用setuptools
  • 我用的是Mac和Lion

我可以使用dev服务器,但每隔几分钟就停止并重新启动一次确实很烦人。有没有办法解决这个问题?

堆栈跟踪的实际问题是,您的代码试图从站点包导入安装工具,而开发服务器不会这样做

“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/setuptools-0.6c11-py2.7.egg”

您需要在应用程序代码库中包含setuptools。它有时工作的事实表明,通过不同模块的代码路径是不同的,并且可能(取决于您在dev中的测试)不同的导入顺序意味着安装工具已导入其他地方,或者仅在代码中的某些点需要


请看一下堆栈跟踪的第4行,其中导入了pytz,下一行来自pkg_resources import resource_流,它触发了导入问题的其余部分。我在项目的根目录下使用了一个假的截断pkg_资源,它不会试图从安装工具中导入内容。您可以在调试导入模式下运行dev服务器,这将告诉您更多信息

这是一个假的PKU资源

"""Package resource API
--------------------

A resource is a logical file contained within a package, or a logical
subdirectory thereof.  The package resource API expects resource names
to have their path parts separated with ``/``, *not* whatever the local
path separator is.  Do not use os.path operations to manipulate resource
names being passed into the API.

The package resource API is designed to work with normal filesystem packages,
.egg files, and unpacked .egg files.  It can also work in a limited way with
.zip files and with custom PEP 302 loaders that support the ``get_data()``
method.
"""

import sys, os, zipimport, time, re, imp, new

try:
    frozenset
except NameError:
   from sets import ImmutableSet as frozenset

from os import utime   #, rename, unlink    # capture these to bypass sandboxing
from os import open as os_open
可能还有其他/更好的方法,但对我来说很有效

哦,我也建议你用pytz代替


干杯

这是我更喜欢的回答

p的
\uuu init\uuuu.py
文件
#try:
#    from pkg_resources import resource_stream
#except ImportError:
resource_stream = None