web-dev-qa-db-fra.com

nom de fichier et numéro de ligne de python script

Comment puis-je obtenir le nom du fichier et le numéro de ligne dans python script.

Exactement les informations de fichier que nous obtenons d'une traceback d'exception. Dans ce cas sans lever d'exception.

90
Joey

Merci à mcandre, la réponse est:

from inspect import currentframe, getframeinfo

frameinfo = getframeinfo(currentframe())

print frameinfo.filename, frameinfo.lineno
133
Joey

Que vous utilisiez currentframe().f_back dépend de si vous utilisez une fonction ou non.

Appelant inspecter directement:

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

Appeler une fonction qui le fait pour vous:

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()
36
aaren

Handy si utilisé dans un fichier commun - imprime le nom du fichier, le numéro de ligne et la fonction de l'appelant:

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

Nom de fichier: __file__ Ou sys.argv[0]
Ligne: inspect.currentframe().f_lineno (pas inspect.currentframe (). F_back.f_lineno comme mentionné ci-dessus)

9
arilou

Mieux vaut utiliser sys aussi-

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

La sortie est:

['__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
6
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 
5
Haroon Rashedu

Juste pour contribuer,

il y a un module linecache en python, voici deux liens qui peuvent aider.

documentation du module linecache
code source linecache

En un sens, vous pouvez "vider" un fichier entier dans son cache et le lire avec les données linecache.cache de class.

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

Pour des informations supplémentaires, pour la gestion des erreurs, vous pouvez simplement utiliser

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