logo

Решение проблемы выполнения многострочных команд в PDB Python

Быстрый ответ

Для выполнения многострочного кода в pdb используйте команду exec. Пример:

Python
Скопировать код
(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:

Python
Скопировать код
(Pdb) !import code; code.interact(local=vars())

Завершение интерактивных сессий

После работы с многострочным кодом нажмите Ctrl-D для выхода из интерактивной сессии и возврата к PDB. Чтобы прекратить отладочную сессию, нажмите Ctrl-C.

Визуализация

Представьте, что вы – шеф-повар, у которого есть рецепт, разбитый на несколько этапов:

Markdown
Скопировать код
📄1: Поджарить лук до золотистого цвета
📄2: Добавить помидоры и тушить
📄3: Заправить блюдо солью, перцем и травами

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

Python
Скопировать код
(pdb) exec("""\
saute_onions()
add_tomatoes()
season_dish()
""")

С помощью pdb вы управляете программой пошагово, будто вы – помощник шеф-повара, который следует рецепту, в то время как вы наблюдаете за каждым этапом приготовления.

Одновременное выполнение нескольких команд

Хотите одновременно выполнить несколько команд? Используйте ; для разделения команд в одной строке в pdb.

Python
Скопировать код
(pdb) !x=0; y=10; print(f'x + y = {x + y}, это математика')

Выполнение нескольких команд на контрольных точках

Если же требуется автоматически выполнить последовательность команд на определённой точке останова, используйте команду commands, а затем завершите ввод команд словом end.

Python
Скопировать код
(pdb) break 23
(pdb) commands
(Pdb) print('Мы на контрольной точке. Как скоро!')
(Pdb) inspect_variables()
(Pdb) end

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

Улучшения PDB в iPython

PDB в iPython предоставляет более гибкие возможности для работы с многострочными выражениями, позволяя динамичнее скриптовать.

Продвинутые методики и советы

Циклы и условные конструкции

Команда exec позволяет работать со сложными многострочными конструкциями, такими как циклы и условные блоки. Главное, следить за корректным форматированием и отступами.

Python
Скопировать код
(Pdb) exec("""\
if x > 10:  # Если x дойдет до барной стойки...
    for i in range(x):  # ...то в течение следующих x раундов...
        print(i)  # ...x побалует всех!
""")

Определение функций в PDB

Определить функции в pdb также возможно. Это помогает на лету тестировать новые идеи в ходе отладки:

Python
Скопировать код
(Pdb) exec("""
def test_function(arg):
    return arg * 2  # Иногда две ошибки могут дать правильный результат! По крайней мере, в Python...
""")

Будьте осторожны

Будьте внимательны при работе с кавычками и слешами для экранирования команды exec, чтобы избежать синтаксических ошибок. Команда exec взаимодействует с текущим пространством имен, поэтому все изменения в переменных будут сохранены в рамках сессии PDB!

Полезные материалы

  1. pdb — Отладчик Python — Документация Python 3.12.2 — официальная документация по использованию pdb.
  2. Python Debugging With Pdb – Real Python — подробное руководство по использованию pdb.
  3. UsingThePythonDebugger – Python Wiki — ресурс сообщества с подробной информацией о функционировании отладчика Python.
  4. Шпаргалка по отладчику Python – Kapeli — справочник команд pdb.
  5. debugging – Отображение стека вызовов из запущенного приложения Python – Stack Overflow — обсуждение на Stack Overflow о способах работы с многострочными выражениями в pdb.