将 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 代码。
我正在将 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 代码。