Не удалось импортировать google/appengine/ext/deferred/handler.py в гибкую среду Google App Engine.

Я использую гибкую среду App Engine (ранее называвшуюся управляемыми виртуальными машинами) и недавно обновился до последней версии gcloud SDK. Он включает в себя несколько новых ошибок:

ERROR: (gcloud.preview.app.deploy) Error Response: [400] Invalid
character
in filename: lib/setuptools/script (dev).tmpl

ERROR: The [application] field is specified in file [.../app.yaml]. This field is not used
by gcloud and must be removed. Project name should instead be
specified either by `gcloud config set project MY_PROJECT` or by
setting the `--project` flag on individual command executions.

ERROR: (gcloud.preview.app.deploy) There is a Dockerfile in the
current directory, and the runtime field in
.../app.yaml is currently set to
[runtime: python27]. To use your Dockerfile to build a custom runtime,
set the runtime field in .../app.yaml
to [runtime: custom]. To continue using the [python27] runtime, please
omit the Dockerfile from this directory.

Я исправил эти ошибки и смог опубликовать снова, но начал видеть такие ошибки:

Failed to import google/appengine/ext/deferred/handler.py
Traceback (most recent call last):
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/vmruntime/meta_app.py", line 549, in GetUserAppAndServe
    app, mod_file = self.GetUserApp(script)
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/vmruntime/meta_app.py", line 410, in GetUserApp
    app = _AppFrom27StyleScript(script)
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/vmruntime/meta_app.py", line 270, in _AppFrom27StyleScript
    app, filename, err = wsgi.LoadObject(script)
  File "/home/vmagent/python_vm_runtime/google/appengine/runtime/wsgi.py", line 85, in LoadObject
    obj = __import__(path[0])
ImportError: Import by filename is not supported.

person Mike Lambert    schedule 28.11.2015    source источник


Ответы (1)


Немного покопавшись, я понял, что происходит. А именно, код, который обрабатывает это:

builtins:
- remote_api: on
- appstats: on
- deferred: on

не работает с управляемыми виртуальными машинами. Правильное исправление состоит в том, чтобы устранить их и вместо этого встроить встроенные включения. Вы можете найти соответствующие включения внутри эти подкаталоги:

В моем случае нужно было добавить это в мою директиву handlers::

- url: /_ah/queue/deferred
  script: google.appengine.ext.deferred.application
  login: admin
- url: /_ah/stats.*
  script: google.appengine.ext.appstats.ui.app
- url: /_ah/remote_api(/.*)?
  script: google.appengine.ext.remote_api.handler.application

Почему, вы можете понять больше здесь. В google/appengine/ext/builtins/__init__.py#L92, он пытается найти соответствующий включаемый файл, используя поле runtime: в вашем app.yaml. Это означает, что там, где ранее он искал deferred/include-python27.yaml, теперь он пытается найти deferred/include-custom.yaml (из-за исправления ошибок, описанных выше) и терпит неудачу. Итак, теперь по умолчанию используется deferred/include.yaml, в котором скрипты включения перечислены по пути, а не по имени модуля. Затем это прерывается в настройке python27-custom-VM (поскольку она ожидает/нуждается в именах модулей)

person Mike Lambert    schedule 28.11.2015
comment
большое спасибо за этот ответ. Я не знаю, почему этого нет в официальной документации по миграции App Engine. - person timc; 12.04.2016
comment
Большое спасибо! Я испытал то же самое, и документы по миграции не сказали мне об этом. Я отредактировал ваш вопрос, чтобы сказать гибкий, так как это новое имя. - person Randy Sugianto 'Yuku'; 29.09.2016