ctypes init 使用本地应用程序引擎、django 和 virtualenv 与 python 2.7 失败

ctypes init fails using local app engine, django and virtualenv with python 2.7

我遇到了 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。它已经投入生产很长时间了,并且 运行 在其他机器上本地成功。这意味着这是我机器的本地问题。我在 Mac OSX 10.15.3 Catalina。

在启动应用程序引擎本地开发服务器后加载应用程序的任何页面时会出现问题。 App Engine 服务器成功启动(我可以访问 App Engine 管理网页),但出现了上述异常(请参阅下面的调用堆栈),因为它似乎 os.uname() 正在返回无效值。

当运行 os.uname()我自己时,结果似乎是合法的。无论是激活 virtualenv 还是使用 os/pyenv python interpeter.

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'

我尝试过的解决方案:

查看完整的调用堆栈,似乎 ctypes init 是从 virtualenv 外部的 interpeter 调用的。如果我在创建 virtualenv 时使用 OS 的 python 或 pyenv python 都是如此。也许它没有在 virtualenv 中找到 ctypes?

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: ''

此外,在 python shell 中导入 ctypes 时,一切正常。这是在虚拟环境中导入的库的路径。 ctypes 和 os 从 pyenv interpeter 导入,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 上找不到任何具有相同问题的结果。 可能是什么问题?

此问题是由在 app.yaml 中配置的旧版本 PIL 引起的。 App Engine 支持开箱即用,最高版本为 1.1.17,它不适用于最新的 python 2 版本。

我安装了 5.0.0 版的 PIL 并从 App Engine 设置中删除了 1.1.17,它解决了问题。