Почему traceback.extract_stack () возвращает [], когда определенно есть стек вызовов? - PullRequest
0 голосов
/ 10 августа 2009

У меня есть класс, который вызывает

traceback.extract_stack()

в его __init__(), но всякий раз, когда я это делаю, значение traceback.extract_stack() равно [].

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

Я думаю, проблема в том, что код работает в Pylons. Вот некоторый код для действия контроллера:

def test_tb(self):
    import traceback
    return a.lib.htmlencode(traceback.extract_stack())

Создает веб-страницу, которая просто

[] 

Итак, я не думаю, что это имеет какое-либо отношение к тому, чтобы быть в конструкторе объекта или чего-то подобного. Может ли это быть связано с несовместимостью между некоторыми видами потоков и модулем трассировки или чем-то в этом роде?

Ответы [ 3 ]

1 голос
/ 10 августа 2009

Ниже показано, как traceback.extract_stack () работает при вызове из метода __init__ класса. Пожалуйста, оставьте свой код, показывающий, что он не работает. Включите версию Python. Не печатайте по памяти; используйте копирование / вставку, как я сделал.

Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import traceback as tb
>>> tb.extract_stack()
[('<stdin>', 1, '<module>', None)]
>>> def func():
...     print tb.extract_stack()
...
>>> func()
[('<stdin>', 1, '<module>', None), ('<stdin>', 2, 'func', None)]
>>> class Klass(object):
...     def __init__(self):
...         print tb.extract_stack()
...
>>> k = Klass()
[('<stdin>', 1, '<module>', None), ('<stdin>', 3, '__init__', None)]
>>>

ОБНОВЛЕНИЕ Вместо того, чтобы смотреть return a.lib.htmlencode(traceback.extract_stack()) и задаться вопросом, нажмите на конвейер:

(1) выполните tb_stack = repr((traceback.extract_stack()) и запишите результат в свой лог-файл для проверки

(2) выполните return a.lib.htmlencode(some_known_constant_data) и убедитесь, что известные данные правильно отображаются там, где вы ожидаете их увидеть.

0 голосов
/ 11 августа 2009

Причина оказалась в том, что кто-то включил Pysco в проекте, и Psyco не очень хорошо работает с модулем traceback.

0 голосов
/ 10 августа 2009

Глядя на код для модуля traceback, можно предположить, что sys.tracebacklimit установлен на ноль, хотя это выглядит как длинный снимок ...

...