Отладка кода в Python

Введение

Примеры

  • 4

    Отладчик Python: пошаговая отладка с помощью _pdb_

    Стандартная библиотека Python включает в себя интерактивную библиотеку отладки под названием PDB . PDB имеет широкие возможности, наиболее распространенные является способностью «пошаговая» программой.

    Чтобы сразу войти в пошаговую отладку, используйте:

     python -m pdb <my_file.py>
    
     

    Это запустит отладчик в первой строке программы.

    Обычно вы хотите нацелить определенный раздел кода для отладки. Для этого мы импортируем библиотеку pdb и используем _set_trace () _, чтобы прервать поток этого проблемного примера кода.

     import pdb
    
    def divide(a, b):
        pdb.set_trace()
        return a/b 
        # What's wrong with this? Hint: 2 != 3
    
    print divide(1, 2)
    
     

    Запуск этой программы запустит интерактивный отладчик.

     python foo.py 
    > ~/scratch/foo.py(5)divide()
    -> return a/b
    (Pdb) 
    
     

    Часто эта команда используется в одной строке, поэтому ее можно закомментировать одним символом #

      import pdf; pdb.set_trace()
    
     

    В (PDB) можно ввести оперативные команды. Эти команды могут быть командами отладчика или python. Для печати переменных можно использовать р из отладчика, или печать питона.

     (Pdb) p a
    1
    (Pdb) print a
    1
    
     

    Чтобы увидеть список всех локальных переменных, используйте

     locals
    
     

    встроенная функция

    Это хорошие команды отладчика, которые нужно знать:

    b <n> | <f>: set breakpoint at line *n* or function named *f*.
    # b 3
    # b divide
    b: show all breakpoints.
    c: continue until the next breakpoint.
    s: step through this line (will enter a function).
    n: step over this line (jumps over a function).
    r: continue until the current function returns.
    l: list a window of code around this line.
    p <var>: print variable named *var*.
    # p x
    q: quit debugger.
    bt: print the traceback of the current execution call stack
    up: move your scope up the function call stack to the caller of the current function
    down: Move your scope back down the function call stack one level
    step: Run the program until the next line of execution in the program, then return control back to the debugger
    next: run the program until the next line of execution in the current function, then return control back to the debugger
    return: run the program until the current function returns, then return control back to the debugger
    continue: continue running the program until the next breakpoint (or set_trace si called again)
    
    
     

    Отладчик также может оценить python в интерактивном режиме:

     -> return a/b
    (Pdb) p a+b
    3
    (Pdb) [ str(m) for m in [a,b]] 
    ['1', '2']
    (Pdb) [ d for d in xrange(5)]
    [0, 1, 2, 3, 4]
    
     

    Замечания:

    Если какие - либо из ваших имен переменных совпадают с командами отладчика, используйте восклицательный знак '! 'перед переменной, чтобы явно ссылаться на переменную, а не на команду отладчика. Например, часто может случиться так , что вы используете имя переменной «C» для счетчика, и вы можете распечатать его в отладчике. команда просто «C» будет продолжать выполнение до следующей точки останова. Вместо того, чтобы использовать «C!» , Чтобы вывести значение переменной следующим образом :

     (Pdb) !c
    4
    
     
  • 4

    Через IPython и ipdb

    Если IPython (или Jupyter ) установлены, отладчик может быть вызван:

     import ipdb
    ipdb.set_trace()
    
     

    По достижении код выйдет и напечатает:

      /home/usr/ook.py(3)<module>()
          1 import ipdb
          2 ipdb.set_trace()
    ----> 3 print("Hello world!")
    
    ipdb>
     

    Понятно, что это означает, что нужно редактировать код. Есть более простой способ:

     from IPython.core import ultratb
    sys.excepthook = ultratb.FormattedTB(mode='Verbose',
                                         color_scheme='Linux',
                                         call_pdb=1)
    
     

    Это приведет к вызову отладчика в случае возникновения необработанного исключения.

  • 0

    Удаленный отладчик

    Иногда вам нужно отлаживать код питона , который выполняется другим процессом и и в этом случае rpdb пригодится.

    rpdb - это оболочка для pdb, которая перенаправляет stdin и stdout в обработчик сокетов. По умолчанию он открывает отладчик на порт 4444

    Использование:

     # In the Python file you want to debug.
    import rpdb
    rpdb.set_trace()
    
     

    И тогда вам нужно запустить это в терминале, чтобы подключиться к этому процессу.

     # Call in a terminal to see the output
    $ nc 127.0.0.1 4444
    
     

    И вы получите PDB Promt

     > /home/usr/ook.py(3)<module>()
    -> print("Hello world!")
    (Pdb)
    
     

Синтаксис

Параметры

Примечания