сохранить переменную в интерактивное пространство имен из отладчика python

Когда я запускаю интерактивный сеанс (в моем случае ipython ), и в настоящее время я внутри отладчика ( ipdb или pdb ), я бы хотел, чтобы я мог поместить переменную в основное интерактивное пространство имен из пространства имен отладки.

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

так что мне хотелось бы, например:

 >>> run -m my.module loading data from disk... done loading data. processing data... --------------------------------------------------------------------------- IndexError Traceback (most recent call last) ... 

-> здесь что-то не получается во время обработки, но загрузка данных работала нормально … поэтому я пошел в отладчик, чтобы проверить, что произошло, и посмотреть loaded_data :

 >>> debug ipdb> len(loaded_data) 100000 

-> Затем я хотел бы сохранить эту переменную в интерактивном пространстве имен для использования вне отладчика, например:

 ipdb> save_to_interactive('loaded_data') ipdb> exit >>> len(loaded_data) 100000 

    One Solution collect form web for “сохранить переменную в интерактивное пространство имен из отладчика python”

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

    Учитывая примерный модуль с точкой останова, которая приводит нас в pdb:

    my_module.py :

     def fun(arg): import pdb; pdb.set_trace() print arg 

    Пример демонстрации базовой концепции:

      >>> import my_module >>> my_module.fun(1) > /Users/lukasgraf/src/stackoverflow/my_module.py(3)fun() -> print arg (Pdb) import sys (Pdb) sys._getframe(0) <frame object at 0x1032ab290> # this is the current frame (Pdb) sys._getframe(0).f_globals['__name__'] 'my_module' # Next outer frame (Pdb) sys._getframe(1).f_globals['__name__'] 'pdb' # etc... # In this example, frame 10 happens to be # the one from the outer interpreter (Pdb) sys._getframe(10).f_globals['__name__'] '__main__' 

    Итак, вот быстрая и грязная функция, которая поднимает стек, ищущий '__name__' со значением '__main__' в глобальных кадрах:

    debughelper.py :

     import sys # Be safe and define a maximum of frames we're trying to walk up MAX_FRAMES = 20 def save_to_interactive(dct): n = 0 # Walk up the stack looking for '__name__' # with a value of '__main__' in frame globals for n in range(MAX_FRAMES): cur_frame = sys._getframe(n) name = cur_frame.f_globals.get('__name__') if name == '__main__': # Yay - we're in the stack frame of the interactive interpreter! # So we update its frame globals with the dict containing our data cur_frame.f_globals.update(dct) break 

    Применение:

     >>> import my_module >>> my_module.fun('foo') > /Users/lukasgraf/src/stackoverflow/my_module.py(3)fun() -> print arg (Pdb) import debughelper (Pdb) debughelper.save_to_interactive({'mykey': 42}) (Pdb) c foo # We continued PDB, so we're in the outer interpreter again >>> print mykey 42 >>> 
      Interesting Posts

      Есть ли лучший способ использовать strip () в списке строк? – python

      Проверить, является ли объект списком списка в python?

      Как получить аутентификацию в телеграмме?

      Модуль бутылки Python вызывает «Ошибка: 413 Request Entity Too Large»

      Эквивалент Python для atoi / atof

      Самая чистая и быстрая настройка сервера для Django

      Как предотвратить str для кодирования символов Unicode в виде шестнадцатеричных кодов?

      EOFError случайно появился при использовании PYTTSX, и мой код теперь постоянно вызывает эту ошибку? Он работал отлично за несколько часов до

      Как написать последовательность Фибоначчи в Python

      Python, Selenium, загружать все типы MIME

      Как получить имя сайта в шаблоне django-cms?

      Хранение данных из файла CSV в базу данных

      Выйти из цикла нажатием клавиши ENTER

      Доступ к глобальным переменным из функции в импортированном модуле

      Официальные несколько версий Python на одном компьютере?

      Python - лучший язык программирования в мире.