Документация по Python

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

В: Документация по Python

Отладчик 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

 

Через 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)

 

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

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

Иногда вам нужно отлаживать код питона , который выполняется другим процессом и и в этом случае 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)

 
Еще от кодкамп
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.