dev_appserver.py говорит Неизвестная среда выполнения ‘python38’

#python #google-app-engine #google-cloud-platform #python-3.8

# #python #google-app-engine #google-облачная платформа #python-3.8

Вопрос:

Я пытаюсь обновить среду выполнения GAE в нескольких проектах python с python37 до python38. Я использовал dev_appserver.py чтобы протестировать приложения локально перед развертыванием, но я получаю неизвестную ошибку времени выполнения после изменения среды выполнения на python38. Python 3.8 должен быть поддерживаемой средой выполнения в соответствии с документами appengine.

Я также обновил все компоненты командной строки gcloud до последней версии. Это просто что-то, что было изменено / устарело, и я просто не знаю об этом? или это на самом деле ошибка и отсутствует в dev_appserver.py инструменте?

Любая помощь будет оценена! 🙂

 RuntimeError: Unknown runtime 'python38'; supported runtimes are 'custom', 'go', 'go111', 'java', 'java7', 'java8', 'php55', 'php72', 'python', 'python-compat', 
'python27', 'python37'.
 

Полная трассировка:

 Traceback (most recent call last):
  File "/mnt/c/Users/Admin/AppData/Local/Google/Cloud SDK/google-cloud-sdk/platform/google_appengine/dev_appserver.py", line 96, in <module>
    _run_file(__file__, globals())
  File "/mnt/c/Users/Admin/AppData/Local/Google/Cloud SDK/google-cloud-sdk/platform/google_appengine/dev_appserver.py", line 90, in _run_file
    execfile(_PATHS.script_file(script_name), globals_)
  File "/mnt/c/Users/Admin/AppData/Local/Google/Cloud SDK/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 613, in <module>
    main()
  File "/mnt/c/Users/Admin/AppData/Local/Google/Cloud SDK/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 601, in main
    dev_server.start(options)
  File "/mnt/c/Users/Admin/AppData/Local/Google/Cloud SDK/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 373, in start
    options.api_host, apiserver.port, wsgi_request_info_)
  File "/mnt/c/Users/Admin/AppData/Local/Google/Cloud SDK/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/dispatcher.py", line 259, in start
    ssl_port)
  File "/mnt/c/Users/Admin/AppData/Local/Google/Cloud SDK/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/dispatcher.py", line 396, in _create_module
    ssl_port=ssl_port)
  File "/mnt/c/Users/Admin/AppData/Local/Google/Cloud SDK/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/module.py", line 1313, 
in __init__
    super(AutoScalingModule, self).__init__(**kwargs)
  File "/mnt/c/Users/Admin/AppData/Local/Google/Cloud SDK/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/module.py", line 599, in __init__
    self._module_configuration)
  File "/mnt/c/Users/Admin/AppData/Local/Google/Cloud SDK/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/module.py", line 226, in _create_instance_factory
    sorted(repr(k) for k in runtime_factories.FACTORIES))))
RuntimeError: Unknown runtime 'python38'; supported runtimes are 'custom', 'go', 'go111', 'java', 'java7', 'java8', 'php55', 'php72', 'python', 'python-compat', 
'python27', 'python37'.
 

Комментарии:

1. gcloud components udpate ?

2. Я уже обновил все свои компоненты gcloud до последних версий, но я по-прежнему получаю ту же ошибку, и в списке поддерживаемых сред выполнения по-прежнему отсутствует python38.

3. Не ответ, но, возможно, обходной путь. Я перестал использовать dev_appserver.py . Вместо этого я запускаю эмулятор хранилища gcloud beta emulators datastore start данных, а затем запускаю свое приложение python main.py .

4. Спасибо @gaefan, но я действительно не хотел переписывать все обработчики из app.yaml в мое приложение на python.

Ответ №1:

ОБНОВЛЕНИЕ: работает и со средой выполнения python39!


Я НАШЕЛ ХИТРЫЙ ОБХОДНОЙ ПУТЬ!

Я нашел и отредактировал runtime_factories.py файл, расположенный в каталоге инструментов gcloud devappserver2. В моей установке Ubuntu 18.04 он был расположен здесь:

 /usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/runtime_factories.py
 

Я добавил python38 к обоим MODERN_RUNTIMES и FACTORIES вот так:

 MODERN_RUNTIMES = set(['python38', 'python37', 'go111'])


FACTORIES = {
    'go': go_factory.GoRuntimeInstanceFactory,
    'go111': go_factory.GoRuntimeInstanceFactory,
    'php55': php_factory.PHPRuntimeInstanceFactory,
    'php72': php_factory.PHPRuntimeInstanceFactory,
    'python': python_factory.PythonRuntimeInstanceFactory,
    'python38': python_factory.PythonRuntimeInstanceFactory,
    'python37': python_factory.PythonRuntimeInstanceFactory,
    'python27': python_factory.PythonRuntimeInstanceFactory,
    'python-compat': python_factory.PythonRuntimeInstanceFactory,
    'custom': custom_factory.CustomRuntimeInstanceFactory,
}
 

Затем нажмите сохранить и запустил dev_appserver.py снова, и ЭТО СРАБОТАЛО! Я также подтвердил, что на самом деле работает среда выполнения python38!

Это означает, что dev_appserver.py список поддерживаемых сред выполнения инструмента еще не обновлен последними средами выполнения python

… Google, если вы видите это, пожалуйста, обновите этот инструмент, чтобы другим не приходилось выполнять это хакерское обходное решение! 🙏

Комментарии:

1. Google делает дерьмовую работу по поддержанию GAE для Python 2 (да, я знаю, что он устарел, но он все еще должен работать) и dev_appserver.py . 🙁 Переход на Python 3 сам по себе болезнен, но с полуразрушенными инструментами это кошмар.

2. Спасибо, что открыли эту проблему! Это действительно абсолютно глупо. Похоже, что у Google недостаточно ресурсов для вставки двух строк в свои скрипты для принудительного использования новых сред выполнения Python. cloud.google.com/appengine/docs/standard/python3/runtime заявляет, что поддержка Python3.9 также уже доступна. Теперь я внес ваше исправление и развернул настроенное на Python3.9 приложение в app Engine, там оно работает просто отлично.