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