Русские Блоги
Python Получить текущий номер строки, имя функции, имя файла
блог http://blog.csdn.net/ksearch/article/details/23131269
Метод использования метода sys._getframe () для получения номера строки и другой информации, метод получения номера строки,
Однако некоторые люди говорят, что эти методы не находятся в стандарте Python,
Модуль Traceback реализован здесь
Трассировка стека, которую мы обычно видим, реализуется через модуль Traceback, например ::
def test_traceback():
import traceback
traceback.print_stack (Limit = 2) # стек вызовов функции печати
Traceback.print_exc () # это нет
Info = traceback.extract_stack (Limit = 2) #return для вызова стека (список), до двух слоев, последним элементом является информация текущей строки, включая (имя файла, номер строки, имя функции, эта строка Код этой строки)
print(info)
Вывод:
[quote][(‘/***/ScriptInfo.py’, 59, », ‘test_traceback()’), (‘/***/ScriptInfo.py’, 56, ‘test_traceback’, ‘info = traceback.extract_stack(limit=2)’)][/quote]
С приведенным выше знанием вы можете настроить оператор печати с помощью номера строки и другой информации:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import traceback
def _stack_tuple_to_function_line_filename(stackTuple):
'' StackTuple: (имя файла, номер строки, имя функции, код этой строки)
'''
filename = stackTuple[0]
linenumber = stackTuple[1]
funcname = stackTuple[2]
# codeline=stackTuple[3]
return 'func: %s, \t\tline: %d, \tfile: %s' % (funcname, linenumber, filename);
def get_filename_function_line (Limit = 1): # Limit = 1 Указывает положение получателя функции.
stackTuple = traceback.extract_stack(limit=limit + 1)[0]
return _stack_tuple_to_function_line_filename(stackTuple)
Def print_with_pos (*args, ** kwargs): оператор #output, так же, как Propint, но затем информация о местоположении вывода
print(*args, **kwargs)
print('\t%s' % get_filename_function_line(limit=2))
Специальный метод использования
[i]from */ScriptInfo.py import print_with_pos as print[/i]
Затем все печатные операторы имеют информацию
Нахождение номера строки, где происходит исключение в коде Python
Здесь я уверен, что исключение происходит в блоке If x: , но я хотел бы знать, в каком операторе блока If x: возникает исключение. Есть ли способ получить номер строки, где происходит исключение?
10 ответов
try: if x: print 'before statement 1' statement1 print 'before statement 2' #ecc. ecc. statement2 statement3 elif y: statement4 statement5 statement6 else: raise except: statement7
Это простой обходной путь, но я предлагаю использовать отладчик
Или даже лучше, используйте модуль sys: D
try: if x: print 'before statement 1' statement1 print 'before statement 2' #ecc. ecc. statement2 statement3 elif y: statement4 statement5 statement6 else: raise except: print sys.exc_traceback.tb_lineno #this is the line number, but there are also other infos
Преимущество использования системных ошибок перед операторами состоит в том, что они записывают более конкретную информацию, которая поможет отладке позже (поверьте мне, я получаю много)
Например. Я записываю их в текстовый файл, поэтому после того, как мои программы автоматически запускаются на сервере в одночасье, я могу найти любые проблемы и иметь достаточно информации, чтобы ускорить восстановление!
import traceback import sys try: print 1/0 except Exception as e: print '1', e.__doc__ print '2', sys.exc_info() print '3', sys.exc_info()[0] print '4', sys.exc_info()[1] print '5', sys.exc_info()[2], 'Sorry I mean line. ',traceback.tb_lineno(sys.exc_info()[2]) ex_type, ex, tb = sys.exc_info() print '6', traceback.print_tb(tb)
> 1 Second argument to a division or modulo operation was zero. > 2 (, ZeroDivisionError('integer division > or modulo by zero',), ) > 3 > 4 integer division or modulo by zero > 5 Sorry I mean line. 5 > 6 File "Z:\Programming\Python 2.7\Error.py", line 5, in > print 1/0 None >>>
Я полагаю, что несколько ответов здесь, рекомендующих вам более тщательно управлять своими try/except блоками, — это ответ, который вы ищете. Это стиль, а не библиотека.
Однако иногда мы оказываемся в ситуации, когда это не стиль, и вам действительно нужно нужен номер строки, чтобы выполнить какое-то другое программирующее действие. Если это то, что вы спрашиваете, вам следует рассмотреть модуль traceback . Вы можете извлечь всю необходимую вам информацию о самом последнем исключении. Функция tb_lineno вернет номер строки, вызвавшей исключение.
>>> import traceback >>> dir(traceback) ['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_format_final_exc_line', '_print', '_some_str', 'extract_stack', 'extract_tb', 'format_exc', 'format_exception', 'format_exception_only', 'format_list', 'format_stack', 'format_tb', 'linecache', 'print_exc', 'print_exception', 'print_last', 'print_list', 'print_stack', 'print_tb', 'sys', 'tb_lineno', 'types'] >>> help(traceback.tb_lineno) Help on function tb_lineno in module traceback: tb_lineno(tb) Calculate correct line number of traceback given in tb. Obsolete in 2.3
Более новые версии трассировки трассировки исправляют проблему до 2.3, позволяя приведенному ниже коду работать так, как было задумано: (это «правильный путь»)
import traceback import sys try: raise Exception("foo") except: for frame in traceback.extract_tb(sys.exc_info()[2]): fname,lineno,fn,text = frame print "Error in %s on line %d" % (fname, lineno)
Мы можем получить номер строки, разделив состояние строки traceback.format_exc() . пожалуйста попробуйте запустить следующий код ..
import traceback try: a = "str" b = 10 c = a + b except Exception as e: err_lineno = str(traceback.format_exc()).split(",")[1] print(err_lineno)
Нахождение номера строки, где происходит исключение в коде Python
Здесь я уверен, что исключение происходит в блоке If x: , но я хотел бы знать, в каком операторе блока If x: возникает исключение. Есть ли способ получить номер строки, где происходит исключение?
10 ответов
try: if x: print 'before statement 1' statement1 print 'before statement 2' #ecc. ecc. statement2 statement3 elif y: statement4 statement5 statement6 else: raise except: statement7
Это простой обходной путь, но я предлагаю использовать отладчик
Или даже лучше, используйте модуль sys: D
try: if x: print 'before statement 1' statement1 print 'before statement 2' #ecc. ecc. statement2 statement3 elif y: statement4 statement5 statement6 else: raise except: print sys.exc_traceback.tb_lineno #this is the line number, but there are also other infos
Преимущество использования системных ошибок перед операторами состоит в том, что они записывают более конкретную информацию, которая поможет отладке позже (поверьте мне, я получаю много)
Например. Я записываю их в текстовый файл, поэтому после того, как мои программы автоматически запускаются на сервере в одночасье, я могу найти любые проблемы и иметь достаточно информации, чтобы ускорить восстановление!
import traceback import sys try: print 1/0 except Exception as e: print '1', e.__doc__ print '2', sys.exc_info() print '3', sys.exc_info()[0] print '4', sys.exc_info()[1] print '5', sys.exc_info()[2], 'Sorry I mean line. ',traceback.tb_lineno(sys.exc_info()[2]) ex_type, ex, tb = sys.exc_info() print '6', traceback.print_tb(tb)
> 1 Second argument to a division or modulo operation was zero. > 2 (, ZeroDivisionError('integer division > or modulo by zero',), ) > 3 > 4 integer division or modulo by zero > 5 Sorry I mean line. 5 > 6 File "Z:\Programming\Python 2.7\Error.py", line 5, in > print 1/0 None >>>
Я полагаю, что несколько ответов здесь, рекомендующих вам более тщательно управлять своими try/except блоками, — это ответ, который вы ищете. Это стиль, а не библиотека.
Однако иногда мы оказываемся в ситуации, когда это не стиль, и вам действительно нужно нужен номер строки, чтобы выполнить какое-то другое программирующее действие. Если это то, что вы спрашиваете, вам следует рассмотреть модуль traceback . Вы можете извлечь всю необходимую вам информацию о самом последнем исключении. Функция tb_lineno вернет номер строки, вызвавшей исключение.
>>> import traceback >>> dir(traceback) ['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_format_final_exc_line', '_print', '_some_str', 'extract_stack', 'extract_tb', 'format_exc', 'format_exception', 'format_exception_only', 'format_list', 'format_stack', 'format_tb', 'linecache', 'print_exc', 'print_exception', 'print_last', 'print_list', 'print_stack', 'print_tb', 'sys', 'tb_lineno', 'types'] >>> help(traceback.tb_lineno) Help on function tb_lineno in module traceback: tb_lineno(tb) Calculate correct line number of traceback given in tb. Obsolete in 2.3
Более новые версии трассировки трассировки исправляют проблему до 2.3, позволяя приведенному ниже коду работать так, как было задумано: (это «правильный путь»)
import traceback import sys try: raise Exception("foo") except: for frame in traceback.extract_tb(sys.exc_info()[2]): fname,lineno,fn,text = frame print "Error in %s on line %d" % (fname, lineno)
Мы можем получить номер строки, разделив состояние строки traceback.format_exc() . пожалуйста попробуйте запустить следующий код ..
import traceback try: a = "str" b = 10 c = a + b except Exception as e: err_lineno = str(traceback.format_exc()).split(",")[1] print(err_lineno)