2010-06-16 8 views
55

¿Cómo puedo obtener el nombre del archivo y el número de línea en el script de Python?nombre de archivo y número de línea del script de python

Exactamente la información de archivo que obtenemos de una traza de excepción. En este caso sin levantar una excepción.

+0

Te estoy downvoting por lo que se podría notar que su respuesta aceptada es incorrecta. – philologon

+2

@philologon Buena suerte. Joey fue visto por última vez hace 3 años. –

+0

Espera, ¿cómo es que no aceptó su propia respuesta? –

Respuesta

-4
inspect.currentframe().f_back.f_lineno 

De ActiveState Code.

+8

Esto es incorrecto y da como resultado el número de línea del archivo FOO.pyc compilado. Esto es lo que uso en su lugar 'message = 'Code location {0.filename} @ {0.lineno}:'. Format (inspect.getframeinfo (inspect.currentframe()))' según la publicación de @ arilou. –

+0

Esto no funciona correctamente al incluir archivos –

+18

Para todos los Googlers: Esta no es la respuesta correcta. ** LA RESPUESTA CORRECTA ES A CONTINUACIÓN **, con más de 15 votos al alza. –

88

Gracias a mcandre, la respuesta es:

from inspect import currentframe, getframeinfo 

frameinfo = getframeinfo(currentframe()) 

print frameinfo.filename, frameinfo.lineno 
+1

El uso de este método tiene algún impacto en el rendimiento (como un pequeño aumento en la ejecución) tiempo o más CPU necesaria)? – gsinha

+3

@gsinha: cada llamada a función tiene un impacto en el rendimiento. Tienes que medir si este impacto es aceptable para ti. – omikron

+0

Por lo tanto, si le gustan las respuestas del tipo "una línea", use: 'importación inspeccione inspeccione.getframeinfo (inspeccione.currentframe()). Lineno' –

6

Nombre del archivo: __file__ o sys.argv[0]
Línea: inspect.currentframe().f_lineno (no inspect.currentframe() f_back.f_lineno como se ha mencionado anteriormente.)

+0

' NameError: nombre global '__file__' no está definido' en mi intérprete de Python: 'Python 2.7.6 (predeterminado, 26 de septiembre de 2014, 15:59:23)'. Consulte http://stackoverflow.com/questions/9271464/what-does-the-file-variable-mean-do/9271617#comment33090606_9271479 – bgoodr

16

Tanto si use currentframe().f_back depende de si está usando la función o no.

Calling inspeccionar directamente:

from inspect import currentframe, getframeinfo 

cf = currentframe() 
filename = getframeinfo(cf).filename 

print "This is line 5, python says line ", cf.f_lineno 
print "The filename is ", filename 

Llamar a una función que lo hace por usted:

from inspect import currentframe 

def get_linenumber(): 
    cf = currentframe() 
    return cf.f_back.f_lineno 

print "This is line 7, python says line ", get_linenumber() 
+0

Más uno, para proporcionar una solución en una función invocable. ¡Muy agradable! – MikeyE

3
import inspect  

file_name = __FILE__ 
current_line_no = inspect.stack()[0][2] 
current_function_name = inspect.stack()[0][3] 

#Try printing inspect.stack() you can see current stack and pick whatever you want 
+0

Similar a '__file__': ver http://stackoverflow.com/questions/3056048/filename-and-line-number-of-python-script#comment74661035_10623150 – bgoodr

3

únicamente contribuyan,

hay un módulo linecache en python, aquí hay dos enlaces que pueden ayudar.

linecache module documentation
linecache source code

En cierto sentido, puede "volcar" un archivo entero en su caché, y leerlo con los datos linecache.cache de clase.

import linecache as allLines 
## have in mind that fileName in linecache behaves as any other open statement, you will need a path to a file if file is not in the same directory as script 
linesList = allLines.updatechache(fileName ,None) 
for i,x in enumerate(lineslist): print(i,x) #prints the line number and content 
#or for more info 
print(line.cache) 
#or you need a specific line 
specLine = allLines.getline(fileName,numbOfLine) 
#returns a textual line from that number of line 

Para información adicional, por el control de errores, puede simplemente usar

from sys import exc_info 
try: 
    raise YourError # or some other error 
except Exception: 
    print(exc_info()) 
3

práctico si se utiliza en un archivo común - Imprimir archivo de nombre, número de línea y la función de la persona que llama:

import inspect 
def getLineInfo(): 
    print(inspect.stack()[1][1],":",inspect.stack()[1][2],":", 
      inspect.stack()[1][3]) 
1

mejor usar sys también-

print dir(sys._getframe()) 
print dir(sys._getframe().f_lineno) 
print sys._getframe().f_lineno 

La salida es:

['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'f_back', 'f_builtins', 'f_code', 'f_exc_traceback', 'f_exc_type', 'f_exc_value', 'f_globals', 'f_lasti', 'f_lineno', 'f_locals', 'f_restricted', 'f_trace'] 
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real'] 
14 
Cuestiones relacionadas