← Назад в блог

Удалённая отладка Python во внешнем окружении. Пример с Blender

Опубликовано
2 мин чтения
--- просмотров

Иногда нужно отлаживать Python-код, который выполняется во внешнем окружении, из локальной IDE. В этом туториале я разберу ситуацию, когда Python-скрипт выполняется в Blender. Мне нужно поставить точку останова, посмотреть значения переменных и пройтись по скрипту шаг за шагом. Покажу два способа — для VSCode и PyCharm.

PyCharm

Этот способ проще и более автоматизирован — почти из коробки. Сначала нужно добавить специальную конфигурацию запуска, затем установить библиотеку pydevd-pycharm. В скрипте, который будет выполняться в Blender, добавь следующую команду для подключения к серверу отладки. На скриншотах ниже показано всё, а код, который нужно встроить в свой скрипт, приведён рядом.

удалённый отладчик в pycharm
# Debug server
import logging
import sys

def connect_debug_server() -> None:
    logging.debug(f"Python path used by Blender: {sys.executable}")
    import pydevd_pycharm
    pydevd_pycharm.settrace('localhost', port=2020)

Затем запусти конфигурацию в PyCharm и выполни скрипт в Blender. IDE остановится на точке останова.

VSCode

Способ для VSCode похож, только используется библиотека debugpy. Ниже — скрипт для подключения к серверу отладки и конфигурация, которую нужно добавить в launch.json. Порядок действий такой: сначала запусти скрипт в Blender — он будет ждать подключения к серверу отладки. Затем запусти конфигурацию из launch.json, и IDE остановится на точке останова.

  // Configuration for launch.json
    {
      "name": "Attach to Blender (debugpy)",
      "type": "python",
      "request": "attach",
      "connect": {
        "host": "127.0.0.1",
        "port": 5678
      },
      "justMyCode": false
    },
# Debug server
import logging
import sys

def connect_debug_server(host="127.0.0.1", port=5678, wait=False):
    logging.debug(f"Blender Python: {sys.executable}")
    try:
        import debugpy
    except Exception as e:
        logging.error(f"debugpy not available: {e}")
        return

    try:
        debugpy.listen((host, port))  # process listens on address:port
        print(f"[debugpy] listening on {host}:{port}")
        if wait:
            print("[debugpy] waiting for VS Code to attach…")
            debugpy.wait_for_client()  # will stop here until attached
            debugpy.breakpoint()
            # optional: immediately catch the execution flow
    except Exception as e:
        logging.exception(f"debugpy.listen failed: {e}")
удалённый отладчик в vscode
удалённый отладчик в vscode

Открыт для работы по контракту

Я доступен для работы по контракту. Если у вас есть интересная идея проекта — запишитесь на звонок через Calendly.

Записаться на 30-минутный звонок