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, он ставится в интерпретатор, а не в систему:
Два интерпретатора, две настройки¶
Именно это место чаще всего путают. Выбора здесь два, и они независимы:
| Настройка | Какой интерпретатор |
|---|---|
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 и другие перезагрузчики¶
Автоперезагрузчик порождает второй процесс, к которому отладчик не прицеплен, и точки останова в воркере не срабатывают. Отключите его:
То же касается любого фреймворка с перезапуском по изменению файлов — --reload
у uvicorn, отладочный перезагрузчик Flask.
Диагностика¶
| Симптом | Причина | Что делать |
|---|---|---|
No module named debugpy |
поставлен в другой интерпретатор | поставьте в тот, что указан в adapter_command |
| Сессия не стартует | adapter_command указывает на несуществующий путь |
проверьте путь к venv |
| Точки останова не срабатывают | автоперезагрузчик породил второй процесс | --noreload |
ImportError для собственного пакета |
рабочий каталог не тот, на который рассчитывает код | Рабочий каталог |
| Останавливается только в библиотечном коде | исключение пришло глубже | Стек вызовов |