Сбой при рекурсивном журнале Интерпретатор в Python 3 - PullRequest
4 голосов
/ 12 марта 2019

Следующий код регистрирует ошибку и вызывает себя, что приводит к переполнению стека и, в конечном итоге, к дампу ядра в Python 3.6.

>>> import logging
>>> def rec():
...     logging.error("foo")
...     rec()
>>> rec()

[1]    101641 abort (core dumped)  python3

FTR, это не приводит к сбою Python 2.7.

Присоединениеошибка (сжатая) в Python 3.6:

ERROR:root:foo
...
--- Logging error ---
Traceback (most recent call last):
...
RecursionError: maximum recursion depth exceeded in comparison
...
Fatal Python error: Cannot recover from stack overflow.
...
[1]    101641 abort (core dumped)  python3

Python 2.7:

RuntimeError: maximum recursion depth exceeded

Но нет дампа ядра в Python 2.7.

FTR, ошибка выше с Python3.6 вступит в игру, если уровень логирования установлен на logging.ERROR.Аналогично для других уровней журнала.

ОБНОВЛЕНИЕ: я зарегистрировал проблему , чтобы обсудить это с сообществом Python.

1 Ответ

2 голосов
/ 12 марта 2019

Ваш код в конечном итоге приведет к RuntimeError (python 2.7) или RecursionError (python 3.6).Это связано с тем, что глубина рекурсии в обоих случаях ограничена 1000:

>>>import sys
>>>sys.getrecursionlimit()
1000

Если это действительно вызывает сбой, вызванный переполнением стека, одной из возможных причин является то, что предел глубины рекурсии был изменен.

...