2013-06-20 3 views
1

Я хочу вызвать функцию в Python, которая позволяет мне получить доступ ко всем текущим переменным во время выполнения (для отладки). Что-то вроде этого:передать все текущие переменные для работы в python

def interruptWithTerminal(): 
    interruptchoice = "" 
    while interruptchoice != "Y": 
     interruptchoice = raw_input("print what variable? (Y to continue script): ") 
     try: 
      print eval(interruptchoice) 
     except: 
      print "Error" 

Моя проблема заключается в том, что я не получаю доступ к переменным в точке, где я называю эту функцию. Есть идеи?

+1

Может быть, вы ищете [ 'глобалов()'] (http://docs.python.org /2/library/functions.html#globals) или ['locals()'] (http://docs.python.org/2/library/functions.html#locals) –

+3

import pdb pdb.set_trace() –

+0

Обычно Я запускаю 'python -i file.py' для запуска вашего файла и откройте интерактивную оболочку. Затем вы можете получить доступ к каждому из них напрямую. – enpenax

ответ

5

С CPython, вы можете найти кадр звонившего с

frame = inspect.currentframe().f_back 

и получить доступ к его жителям и глобал с frame.f_locals и frame.f_globals.


import inspect 
def interruptWithTerminal(): 
    frame = inspect.currentframe().f_back 
    while True: 
     interruptchoice = raw_input("print what variable? (Press Enter to continue): ") 
     if not interruptchoice.strip(): break 
     try: 
      print eval(interruptchoice, frame.f_globals, frame.f_locals) 
     except: 
      print "Error" 

С Y может быть переменной, может быть, пусть пользователь нажмет Enter вырваться из петли вместо этого.

+0

ворчать, ворчать ... Я как раз собирался опубликовать что-то о проверке рамки стека. Красиво сделано :) (+1 от меня) – mgilson

+0

@mgilson: Просто повезло на этот раз :) – unutbu

+0

Хотя, для чего это стоит, 'pdb.set_trace()', вероятно, лучше, чем любое полупеченое решение, которое мы могли бы придумать. Но, в любом случае, приятно знать, как скорее всего реализуется 'pdb.set_trace()'): – mgilson

0

Что-то вроде этого?

>>> var = True 
>>> import __main__ as main 
>>> for attr in dir(main): 
    print str(attr), '=', repr(getattr(main, attr)) 


__builtins__ = <module '__builtin__' (built-in)> 
__doc__ = None 
__name__ = '__main__' 
__package__ = None 
attr = 'attr' 
main = <module '__main__' (built-in)> 
var = True 

Вы можете сделать словарь всех переменных, как это:

>>> var = True 
>>> import __main__ as main 
>>> d = {attr:getattr(main, attr) for attr in dir(main)} 
>>> d 
{'attr': 'var', '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'var': True, '__name__': '__main__', 'main': <module '__main__' (built-in)>, '__doc__': None}