【问题标题】:Converting Django project from Python 2 to Python 3: How to fix Python int OverFlowError?将 Django 项目从 Python 2 转换为 Python 3:如何修复 Python int OverFlowError?
【发布时间】:2019-09-11 07:38:51
【问题描述】:

我正在将一个 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 能够正常运行服务器并生成网站,但它却因上述溢出错误而挂起。

【问题讨论】:

  • 你在使用什么样的系统(64位/32位)以及你是如何安装python3.7的?
  • 您是否在不同的 Python 实现下运行?您在此处的设置似乎很不正常……没有理由在该行上失败。 :-(
  • @FlyingTeller 64 位 osx,python 3.7 安装 virtualenv。

标签: python django python-2to3


【解决方案1】:

_collections_abc.py 中的原始代码,在 Python 3 版本中为:

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 代码。

【讨论】:

    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多