Ошибка инициализации ctypes с использованием локального ядра приложения, django и virtualenv с python 2.7 - PullRequest
1 голос
/ 16 марта 2020

У меня проблема с инициализацией ctypes

if int(_os.uname()[2].split('.')[0]) < 8:
ValueError: invalid literal for int() with base 10: '

Мое приложение написано на Python 2.7 и основано на Django, работает локально с использованием App Engine SDK и virtualenv. Он был в производстве в течение длительного времени и успешно работает локально на других машинах. Это означает, что это локальная проблема для моей машины. Я нахожусь на Ma c OSX 10.15.3 Catalina.

Проблемы возникают при загрузке любой страницы моего приложения после запуска локального сервера разработки движка приложения. Сервер App Engine успешно запускается (я могу получить доступ к веб-странице администратора механизма приложений), но возникает вышеупомянутое исключение (см. Стэк вызовов ниже), так как кажется, что os.uname() возвращает недопустимое значение.

Когда работает os.uname() сам, результат кажется le git. И при активации virtualenv, или с использованием интерпретатора os / pyenv python.

Python 2.7.15 (default, Mar 15 2020, 22:00:51) 
[GCC 4.2.1 Compatible Apple LLVM 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.uname()[2].split('.')[0]
'19'

Решения, которые я пробовал:

  • Вызов os.uname() внутри и снаружи virtualenv, работает правильно.
  • Создание virtualenv с использованием системы Python 2.7.17 установка
  • Создание virtualenvs с использованием pyenv с 3 различными python 2 версиями (2.7.17, 2.7 .16, 2.7.15)

Глядя на полный стек вызовов, кажется, что ctypes init вызывается из интерпретатора за пределами virtualenv. Это верно и в том случае, если при создании virtualenv я использую ОС python или pyenv python. Может быть, он не находит ctypes в virtualenv?

Traceback (most recent call last):
  File "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 240, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/platform/google_appengine/google/appengine/api/lib_config.py", line 358, in __getattr__
    self._update_configs()
  File "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/platform/google_appengine/google/appengine/api/lib_config.py", line 294, in _update_configs
    self._registry.initialize()
  File "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/platform/google_appengine/google/appengine/api/lib_config.py", line 165, in initialize
    import_func(self._modname)
  File "/Users/myuser/.pyenv/versions/2.7.15/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/Users/myuser/git/myproject/appengine_config.py", line 38, in <module>
    cloud_sql_conn_retry.monkey_patch_mysql_backend()
  File "/Users/myuser/git/myproject/server/utils/cloud_sql_conn_retry.py", line 14, in monkey_patch_mysql_backend
    from django.db.backends.mysql.base import DatabaseWrapper
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 38, in <module>
    from .creation import DatabaseCreation                      # isort:skip
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/db/backends/mysql/creation.py", line 4, in <module>
    from django.db.backends.base.creation import BaseDatabaseCreation
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/db/backends/base/creation.py", line 5, in <module>
    from django.core import serializers
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 23, in <module>
    from django.core.serializers.base import SerializerDoesNotExist
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/core/serializers/base.py", line 4, in <module>
    from django.db import models
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/db/models/__init__.py", line 3, in <module>
    from django.db.models.aggregates import *  # NOQA
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/db/models/aggregates.py", line 5, in <module>
    from django.db.models.expressions import Func, Star
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/db/models/expressions.py", line 6, in <module>
    from django.db.models import fields
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 14, in <module>
    from django import forms
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/forms/__init__.py", line 7, in <module>
    from django.forms.fields import *  # NOQA
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/forms/fields.py", line 17, in <module>
    from django.core import validators
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/core/validators.py", line 507, in <module>
    allowed_extensions=get_available_image_extensions(),
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/django/core/validators.py", line 498, in get_available_image_extensions
    from PIL import Image
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/PIL/Image.py", line 134, in <module>
    from pathlib2 import Path
  File "/Users/myuser/git/myproject/env/lib/python2.7/site-packages/pathlib2/__init__.py", line 5, in <module>
    import ctypes
  File "/Users/myuser/.pyenv/versions/2.7.15/lib/python2.7/ctypes/__init__.py", line 29, in <module>
    if int(_os.uname()[2].split('.')[0]) < 8:
ValueError: invalid literal for int() with base 10: ''

Кроме того, при импорте ctypes в оболочку python все работает. Вот пути к библиотекам, которые импортируются в виртуальной среде. ctypes и os импортируются из интерпретатора pyenv, а django импортируется из virtualenv python. Мне не понятно почему, и я подозреваю, что это может быть связано с этой проблемой.

>>> import ctypes
>>> print(ctypes)
<module 'ctypes' from '/Users/myuser/.pyenv/versions/2.7.15/lib/python2.7/ctypes/__init__.pyc'>
>>> import os
>>> print (os)
<module 'os' from '/Users/myuser/.pyenv/versions/2.7.15/lib/python2.7/os.pyc'>
>>> import django
>>> print (django)
<module 'django' from '/Users/myuser/git/myapp/env/lib/python2.7/site-packages/django/__init__.pyc'>

Я не смог найти никакого результата в Google с той же проблемой. В чем может быть проблема?

1 Ответ

2 голосов
/ 17 марта 2020

Проблема была вызвана старой версией PIL, настроенной в app.yaml. Встроенная поддержка App Engine до версии 1.1.17, которая не работает с последней версией python 2.

Я установил версию 5.0.0 PIL и удалил 1.1.17 из приложения Настройки двигателя и это решило проблему.

...