我正在将 Django 网站从 Python 2 转换为 Python 3。为此,我对整个项目运行了 2to3。现在,在运行服务器(在 Python 2 中运行良好)时,会发生 OverflowError,如第一个代码块中所示。下面的 block 显示了 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 ,在 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 代码。
