Перейти к содержанию

debugpy

Язык: Python · Транспорт: stdio

Запись каталога:

[adapters.debugpy]
id = "debugpy"
command = "python3"
args = ["-m", "debugpy.adapter"]
transport = "stdio"

python3, а не python: голого python в PATH на macOS обычно нет. Настоящий интерпретатор чаще всего лежит в venv проекта и приходит через adapter_command.

Установка

debugpy — модуль Python, он ставится в интерпретатор, а не в систему:

.venv/bin/pip install debugpy
python3 -m debugpy --version

Два интерпретатора, две настройки

Именно это место чаще всего путают. Выбора здесь два, и они независимы:

Настройка Какой интерпретатор
adapter_command запускает адаптер
launch_arguments.python выполняет ваш код
[profiles.main]
adapter = "debugpy"
adapter_command = "${root}/.venv/bin/python"
program = "main.py"

[profiles.main.launch_arguments]
python = "${root}/.venv/bin/python"

Обычно это один и тот же интерпретатор, и bugsaur init пишет оба, когда находит .venv/bin/python или venv/bin/python в корне проекта. Настройки при этом остаются раздельными, и No module named debugpy почти всегда означает, что одна из них указывает на интерпретатор без установленного debugpy.

Рабочий каталог доходит до отлаживаемого явно

В отличие от Delve, debugpy не отдаёт свой рабочий каталог отлаживаемому по наследству. Bugsaur передаёт рабочий каталог в теле DAP-запроса — поэтому корень проекта надёжно становится каталогом отлаживаемого процесса, и поэтому импорты пакета из src/ разрешаются без строки cwd.

Отладка модуля

debugpy принимает module. Поля профиля для него нет, поэтому используется аварийный выход:

[profiles.tests]
adapter = "debugpy"
program = "."
args = ["-x", "tests/"]

[profiles.tests.launch_arguments]
module = "pytest"

Django и другие перезагрузчики

Автоперезагрузчик порождает второй процесс, к которому отладчик не прицеплен, и точки останова в воркере не срабатывают. Отключите его:

args = ["runserver", "--noreload", "8000"]

То же касается любого фреймворка с перезапуском по изменению файлов — --reload у uvicorn, отладочный перезагрузчик Flask.

Диагностика

Симптом Причина Что делать
No module named debugpy поставлен в другой интерпретатор поставьте в тот, что указан в adapter_command
Сессия не стартует adapter_command указывает на несуществующий путь проверьте путь к venv
Точки останова не срабатывают автоперезагрузчик породил второй процесс --noreload
ImportError для собственного пакета рабочий каталог не тот, на который рассчитывает код Рабочий каталог
Останавливается только в библиотечном коде исключение пришло глубже Стек вызовов