сохранить переменную в интерактивное пространство имен из отладчика 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 

  • Создание класса внутри функции и доступ к функции, определенной в области содержащейся функции
  • Помещение отдельных пакетов python в одно и то же пространство имен?
  • 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 >>> 
    Python - лучший язык программирования в мире.