GAE 1.5.5本地SDK在python2.7运行时无法运行
GAE 1.5.5 看起来有一些很棒的、大家期待已久的功能。不过,这些功能对我来说还没法用。
我已经下载并安装了 GAE 1.5.5,并且正在用一个简单的 "AAA" 应用来测试。
以下是我大概的 app.yaml 文件(为了测试做了各种修改)。
app.yaml
application: AAA # mystical creation.
version: alpha-1
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /media
static_dir: media/
- url: /favicon.ico
static_files: media/images/favicon.ico
upload: media/images/favicon.ico
- url: /admin
script: AAA.app
login: admin
- url: /.*
script: AAA.app
skip_files:
- ^(.*/)?app\.yaml
libraries:
- name: django
version: "1.2"
- name: jinja2
version: latest
- name: yaml
version: latest
我在 Mac OS X Lion (10.7.1) 上运行这个。
我猜我实际上并没有使用 Python 2.7 的运行环境,尽管在 app.yaml 中声明了要使用它。我不太确定怎么验证这个猜想,但我遇到的错误和这个猜想是一致的。下面是我遇到的错误。
Python 路径
当 Google App Engine 的 Python 路径没有设置时,应用引擎会使用 Python 2.6.6。
为了解决这个问题,我在 Google App Engine 的设置中把 Python 路径设置为 /usr/bin/python2.7
。
WSGI
我遇到了以下错误:
/Applications/GoogleAppEngineLauncher.app/Contents/Resources/
GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/
google/appengine/tools/dev_appserver.py in
GetParentPackage(self=<google.appengine.tools.dev_appserver.HardenedModulesHook
object>, fullname='AAA.app')
2334
2335 if self.find_module(fullname) is None:
=> 2336 raise ImportError('Could not find module %s' %
fullname)
2337
2338 return self._module_dict[parent_module_fullname]
builtin ImportError = <type 'exceptions.ImportError'>, fullname =
'AAA.app'
<type 'exceptions.ImportError'>: Could not find module AAA.app
args = ('Could not find module AAA.app',)
message = 'Could not find module AAA.app'
我尝试将 AAA.app 设置为:
AAA.py:
from google.appengine.dist import use_library
use_library('django', '1.2') # otherwise we still get django 0.96
from django.core.handlers import wsgi
app = wsgi.WSGIHandler()
AAA/__init__.py
# same content as above
AAA/AAA.py
# same content as above
请注意,我可以继续运行修改过的 CGI 和 app.yaml 以及 AAA.py,mutatis mutandis。不过这样做仍然会导致下面的错误:
Jinja2
当我运行 import jinja2
时,我得到了一个 ImportError
。
Django2
没有:
from google.appengine.dist import use_library
use_library('django', '1.2')
我最后得到的是 Django 0.96。
理论
考虑到以下几点:
- http://code.google.com/appengine/docs/python/tools/libraries27.html 上说 "google.appengine.dist 包提供的 use_library() 函数在 Python 2.7 中不可用。"
- use_library 对我有效
- use_library 是必要的,因为 "libraries: {django: {..., version: "1.2"}}" 的声明并没有把 django 版本设置为 1.2
- 只有 Django 1.2 被包含在 Python 2.7 的运行环境中(根据上面的 libraries27.html 链接)
- 我必须在 Python 路径中手动指定 Python 2.7,才能让 GAE 使用 Python 2.7
- WSGI 没有正确加载应用
- 无法导入 Jinja2
我相信我并没有真正使用 Python 2.7 的 GAE 运行环境(也就是说,app.yaml 的声明在 GAE 1.5.5 SDK 中被忽略了)。
希望以上内容能对你有所帮助,如果你有什么想法,关于这里可能发生了什么以及潜在的解决方案,我将非常感激。
3 个回答
Allbuttonspressed 最近发布了一份很实用的指南;
你可以在 Python 2.7 上运行dev_appserver
,并且将threadsafe
设置为“是”。
你可以在本地的SDK中使用2.7版本的运行环境,但不能在线程安全模式下使用,也不能把你的应用定义成 script: your.app
。你应该使用 script: your_main_script.py
这种方式。
对于在SDK中不可用的jinja2和webapp2,你可以下载它们并把它们放到SDK的基础目录下,这个目录默认会被添加到sys.path中。
虽然你不能测试多线程的功能,但其他的功能都可以正常使用。在你部署之前,只需要对 app.yaml
和 your_main_script.py
做一些修改就可以了。
补充:我还需要在我的 your_main_script.py
中加上 os.environ[u'APPENGINE_RUNTIME'] = u'python27'
,这样才能强制SDK使用webapp2。
我在Windows上也遇到了同样的问题,我在Google App Engine的论坛上发了帖,这里是我收到的官方回复:
开发服务器还不支持2.7版本。目前测试基于2.7的代码的唯一方法是在appengine上。