2011-01-14 27 views
8

¿Hay alguna forma relativamente simple de incluir programáticamente las líneas de código fuente en el informe del registrador de Python? Por ejemplo ...Cómo imprimir las líneas de código fuente en el registrador de Python

import logging 

def main(): 
    something_is_not_right = True 
    logging.basicConfig(level=logging.DEBUG, 
         format=('%(filename)s: '  
           '%(levelname)s: ' 
           '%(funcName)s(): ' 
           '%(lineno)d:\t' 
           '%(message)s') 
         ) 

    if something_is_not_right == True: 
     logging.debug('some way to get previous line of source code here?') 

Para que la salida se vea así.

example.py: DEBUG: main(): 14:  if something_is_not_right == True: 
+0

Doesn' ¿Eso ya lo hace? – marcog

+0

@marcog Perdón por mi incapacidad para explicar mi problema más claramente. TryPyPy y unutbu entendieron lo que estaba buscando. Espero que sus respuestas expliquen lo que estaba buscando. – ojs

+0

También hice la misma suposición que marcog y no pude entender cuál era el problema. Tal vez edite su pregunta para leer "programáticamente incluya _arbitrary_ las líneas de código fuente, no solo la línea que registra" –

Respuesta

12
import inspect 
import logging 
import linecache 

def main(): 
    something_is_not_right = True 
    logging.basicConfig(level=logging.DEBUG, 
         format=('%(filename)s: '  
           '%(levelname)s: ' 
           '%(funcName)s(): ' 
           '%(lineno)d:\t' 
           '%(message)s') 
         ) 

    if something_is_not_right: 
     logging.debug(linecache.getline(
      __file__, 
      inspect.getlineno(inspect.currentframe())-1)) 

if __name__=='__main__': 
    main() 

rendimientos

test.py: DEBUG: main(): 18:  if something_is_not_right == True: 
+0

Wow, esto está pidiendo a gritos por simple ____file____ y ​​____line____ (sin ninguna de las cosas de inspect/currentframe). – jarmod

+0

+1 de mí - nunca supe sobre 'linecache'. –

4

Sólo porque vi unutbu intentar algo similar, aquí está el código que se me ocurrió (demasiado tarde para publicar lo contrario):

import logging, sys 

# From logging.py 
def currentframe(): 
    """Return the frame object for the caller's stack frame.""" 
    try: 
     raise Exception 
    except: 
     return sys.exc_traceback 

f = open(__file__.rstrip('c')) 
owncode = f.readlines() 
f.close() 

def main(): 
    something_is_not_right = True 
    logging.basicConfig(level=logging.DEBUG, 
         format=('%(filename)s: ' 
           '%(levelname)s: ' 
           '%(funcName)s(): ' 
           '%(lineno)d:\t' 
           '%(message)s') 
         ) 

    if something_is_not_right == True: 
     prev = owncode[currentframe().tb_frame.f_back.f_lineno - 2] 
     logging.debug('previous line of source code here:\n%s' % prev) 

if __name__ == '__main__': 
    main() 
Cuestiones relacionadas