将 Django 项目从 Python 2 转换为 Python 3:如何修复 Python int OverFlowError?

Converting Django project from Python 2 to Python 3: How to fix Python int OverFlowError?

我正在将 Django 网站从 Python 2 转换为 Python 3。为此,我对整个项目 运行 2to3。现在,在 运行 连接服务器(在 Python 2 中工作正常)时,出现 OverflowError,如第一个代码块所示。下面的块显示 manage.py 文件。

我在别处读到这可能是与 int/float 有关的问题,但我不太确定如何处理与此相关的迭代器。

(env) user:languages user$ python3 manage.py runserver
Fatal Python error: initsite: Failed to import the site module
Traceback (most recent call last):
  File ".../src/languages/env/bin/../lib/python3.7/site.py", line 66, in <module>
    import os
  File ".../src/languages/env/bin/../lib/python3.7/os.py", line 661, in <module>
    from _collections_abc import MutableMapping
  File "...src/languages/env/bin/../lib/python3.7/_collections_abc.py", line 45, in <module>
    longrange_iterator = type(iter(list(range(1 << 1000))))
OverflowError: Python int too large to convert to C ssize_tappleperson
#!/usr/bin/env python3

import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "site.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

我原以为 manage.py 会 运行 服务器正常运行并生成网站,但它却因上述溢出错误而挂断。

_collections_abc.py中的原始代码,在Python3版本中,是:

longrange_iterator = type(iter(range(1 << 1000)))

您的版本是

longrange_iterator = type(iter(list(range(1 << 1000))))

您似乎也在 Python3 代码中使用了 2to3。 range 在 Python 2 中创建了一个列表,因此 Python 3 中的确切等价物是 list(range(...)),这似乎是此处发生的替换。它失败了,因为它强制代码创建一个巨大的列表,而原始列表没有。

因此,在使用 2to3 时,仅将其应用于 Python 2 代码。