Решение проблемы выполнения многострочных команд в PDB Python
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для выполнения многострочного кода в pdb
используйте команду exec
. Пример:
(Pdb) exec("for i in range(5): print(i)")
Этот код выведет числа от 0 до 4, каждое число на новой строке.
Для интерактивных сессий Python, используйте межсессионный отладчик и введите команду !import code; code.interact(local=vars())
. Для выхода из такой сессии, нажмите Ctrl-D
, а для остановки работы PDB – Ctrl-C
.
Выполнение многострочных выражений в PDB
Интерактивные сессии в PDB
Если вы хотите создать полноценную среду Python внутри PDB для более эффективной отладки, воспользуйтесь следующей командой, чтобы открыть интерактивную сессию Python:
(Pdb) !import code; code.interact(local=vars())
Завершение интерактивных сессий
После работы с многострочным кодом нажмите Ctrl-D
для выхода из интерактивной сессии и возврата к PDB. Чтобы прекратить отладочную сессию, нажмите Ctrl-C
.
Визуализация
Представьте, что вы – шеф-повар, у которого есть рецепт, разбитый на несколько этапов:
📄1: Поджарить лук до золотистого цвета
📄2: Добавить помидоры и тушить
📄3: Заправить блюдо солью, перцем и травами
Используя pdb
, вы готовите блюдо, выполняя каждый из этапов последовательно.
(pdb) exec("""\
saute_onions()
add_tomatoes()
season_dish()
""")
С помощью pdb
вы управляете программой пошагово, будто вы – помощник шеф-повара, который следует рецепту, в то время как вы наблюдаете за каждым этапом приготовления.
Одновременное выполнение нескольких команд
Хотите одновременно выполнить несколько команд? Используйте ;
для разделения команд в одной строке в pdb
.
(pdb) !x=0; y=10; print(f'x + y = {x + y}, это математика')
Выполнение нескольких команд на контрольных точках
Если же требуется автоматически выполнить последовательность команд на определённой точке останова, используйте команду commands
, а затем завершите ввод команд словом end
.
(pdb) break 23
(pdb) commands
(Pdb) print('Мы на контрольной точке. Как скоро!')
(Pdb) inspect_variables()
(Pdb) end
Для того, чтобы получить больше информации о выполнении многострочных команд на определённых этапах программы, используйте (pdb) help commands
.
Улучшения PDB в iPython
PDB в iPython предоставляет более гибкие возможности для работы с многострочными выражениями, позволяя динамичнее скриптовать.
Продвинутые методики и советы
Циклы и условные конструкции
Команда exec
позволяет работать со сложными многострочными конструкциями, такими как циклы и условные блоки. Главное, следить за корректным форматированием и отступами.
(Pdb) exec("""\
if x > 10: # Если x дойдет до барной стойки...
for i in range(x): # ...то в течение следующих x раундов...
print(i) # ...x побалует всех!
""")
Определение функций в PDB
Определить функции в pdb
также возможно. Это помогает на лету тестировать новые идеи в ходе отладки:
(Pdb) exec("""
def test_function(arg):
return arg * 2 # Иногда две ошибки могут дать правильный результат! По крайней мере, в Python...
""")
Будьте осторожны
Будьте внимательны при работе с кавычками и слешами для экранирования команды exec
, чтобы избежать синтаксических ошибок. Команда exec
взаимодействует с текущим пространством имен, поэтому все изменения в переменных будут сохранены в рамках сессии PDB!
Полезные материалы
- pdb — Отладчик Python — Документация Python 3.12.2 — официальная документация по использованию pdb.
- Python Debugging With Pdb – Real Python — подробное руководство по использованию pdb.
- UsingThePythonDebugger – Python Wiki — ресурс сообщества с подробной информацией о функционировании отладчика Python.
- Шпаргалка по отладчику Python – Kapeli — справочник команд pdb.
- debugging – Отображение стека вызовов из запущенного приложения Python – Stack Overflow — обсуждение на Stack Overflow о способах работы с многострочными выражениями в pdb.