GAE 1.5.5本地SDK在python2.7运行时无法运行

6 投票
3 回答
862 浏览
提问于 2025-04-17 04:09

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 个回答

1

Allbuttonspressed 最近发布了一份很实用的指南
你可以在 Python 2.7 上运行dev_appserver,并且将threadsafe设置为“是”。

4

你可以在本地的SDK中使用2.7版本的运行环境,但不能在线程安全模式下使用,也不能把你的应用定义成 script: your.app。你应该使用 script: your_main_script.py 这种方式。

对于在SDK中不可用的jinja2和webapp2,你可以下载它们并把它们放到SDK的基础目录下,这个目录默认会被添加到sys.path中。

虽然你不能测试多线程的功能,但其他的功能都可以正常使用。在你部署之前,只需要对 app.yamlyour_main_script.py 做一些修改就可以了。

补充:我还需要在我的 your_main_script.py 中加上 os.environ[u'APPENGINE_RUNTIME'] = u'python27',这样才能强制SDK使用webapp2。

6

我在Windows上也遇到了同样的问题,我在Google App Engine的论坛上发了帖,这里是我收到的官方回复:

开发服务器还不支持2.7版本。目前测试基于2.7的代码的唯一方法是在appengine上。

撰写回答