имя файла и номер строки скрипта Python

python debugging file

81090 просмотра

7 ответа

Как я могу получить имя файла и номер строки в скрипте Python.

Именно информацию о файле мы получаем из трассировки исключений. В этом случае без повышения исключения.

Автор: Joey Источник Размещён: 13.11.2019 11:30

Ответы (7)


143 плюса

Благодаря Макандре, ответ таков:

from inspect import currentframe, getframeinfo

frameinfo = getframeinfo(currentframe())

print frameinfo.filename, frameinfo.lineno
Автор: Joey Размещён: 16.06.2010 06:52

40 плюса

Используете ли вы, currentframe().f_backзависит от того, используете ли вы функцию или нет.

Звонить проверять напрямую:

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

Вызов функции, которая делает это за вас:

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()
Автор: aaren Размещён: 04.12.2013 10:12

20 плюса

Удобно, если используется в общем файле - печатает имя файла, номер строки и функцию вызывающей стороны:

import inspect
def getLineInfo():
    print(inspect.stack()[1][1],":",inspect.stack()[1][2],":",
          inspect.stack()[1][3])
Автор: Streamsoup Размещён: 21.08.2017 12:05

9 плюса

Имя файла: __file__или sys.argv[0]
строка: inspect.currentframe().f_lineno(не inspect.currentframe (). F_back.f_lineno, как указано выше)

Автор: arilou Размещён: 16.05.2012 04:54

6 плюса

Лучше использовать sys также

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

Выход:

['__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
Автор: Mohammad Shahid Siddiqui Размещён: 31.08.2017 04:57

5 плюса

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 
Автор: Haroon Rashedu Размещён: 18.06.2014 01:09

4 плюса

Просто чтобы внести свой вклад,

linecacheв Python есть модуль, вот две ссылки, которые могут помочь.

документация по модулю
linecache Исходный код linecache

В некотором смысле, вы можете «сбросить» весь файл в его кеш и прочитать его с данными linecache.cache из класса.

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

Для дополнительной информации, для обработки ошибок, вы можете просто использовать

from sys import exc_info
try:
     raise YourError # or some other error
except Exception:
     print(exc_info() )
Автор: Danilo Размещён: 29.12.2016 08:49
Вопросы из категории :
32x32