как отладка функции Azure Python, работающей в оболочке, и отладка в Intellij IDE

Я новичок в Azure и не знаю, как настроить запуск Azure в конфигурации проекта Intellij.

В этот момент я пытаюсь отладить свою первую функцию http-триггера (на Python), которую я запускаю в оболочке, и помещаю точки отладчика.

Проблема: выполняемая функция не возвращает строку ответа и не останавливается в точке отладчика.

Вот скриншот, на котором вы можете увидеть, что localhost:7071 успешно запущен, но когда я пытаюсь запустить свою функцию с помощью http://localhost:7071/api/first-http-trigger?name=sdaf, он не отвечает: Hello, {name}. This HTTP triggered function executed successfully. и не останавливает отладчик

введите описание изображения здесь

Также я создал конфигурацию azure для Intellij, но она вообще не работает

введите описание изображения здесь

ОБНОВИТЬ:

function.json

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}

Также я успешно исправил проблему с localhost api http: // localhost: 7071 / api / first-http-trigger? Name = sdaf.

Проблема заключалась в том, что func init был инициирован в корневом каталоге, но func new был выполнен в дочернем. Значит конфиги были некорректными.

Я решил это с самого начала и выполнил все команды в одном каталоге (func init, func new, func start)

Но осталась проблема: точки отладки не работают, и я не могу настроить запуск Azure в конфигурациях Idea.


person Alexey Nikonov    schedule 06.12.2020    source источник
comment
Не могли бы вы также поделиться своим function.json файлом?   -  person Anton Komyshan    schedule 06.12.2020
comment
@AntonKomyshan добавлен function.json   -  person Alexey Nikonov    schedule 06.12.2020


Ответы (2)


Но осталась проблема: точки отладки не работают, и я не могу настроить запуск Azure в конфигурациях Idea.

func init, func new, func start, эти три вещи по сути являются консольными командами. Он может только убедиться, что вы можете запустить приложение-функцию.

Для Intellij IDEA и VS Code ключом являются расширения, или, скажем, плагины. Сначала вам нужно получить поддержку для этого языка. И тогда вам понадобится плагин для отладки. Для VS Code это «расширение лазурной функции». А для intellij IDEA это «Набор инструментов Azure для Intellij». «Лазурное расширение функции» VS Code может поддерживать несколько языков. Но для «Azure Toolkit for Intellij», к сожалению, он ориентирован на Java (если вы хотите использовать его для отладки приложения-функции, вы обнаружите, что не можете выбрать какой-либо модуль. Это связано с тем, что оно не считало, что ваше приложение-функция это Java-проект.)

Рекомендуется использовать VS Code для разработки приложений-функций локально, чтобы вы могли получить поддержку отладки для приложений-функций на всех языках. (Если вы используете VS Code, вам просто нужны две вещи: один - плагин python, а другой - функция azure. плагин расширения, и тогда вы сможете без проблем выполнять отладку.)

person Bowman Zhu    schedule 08.12.2020
comment
Вы знаете, это проблема, что MS не хочет хорошо поддерживать продукты Idea, и поэтому они заставляют использовать VSCode, но я бы предпочел пойти на AWS и получить неплохие наборы инструментов в Intellij, чем изменит мою рабочую среду. - person Alexey Nikonov; 09.12.2020

К сожалению, PyCharm учитывает точки останова только тогда, когда код, содержащий их, выполняется через конфигурацию запуска в отладчике. При запуске в терминале - это просто какой-то процесс, о котором IDE мало что знает.

Это действительно не очень удобно, так как бывают случаи, когда вы не можете выполнить код в IDE напрямую, поэтому в PyCharm есть специальная функция под названием Сервер отладки Python.

Должен признаться, я не пробовал использовать его с функциями Azure Python.

Архитектура отладчика

Для лучшего понимания давайте рассмотрим, как работает отладчик в PyCharm. Он состоит из двух частей - Backend и Frontend:

  • Бэкэнд написан на Python (ответвление pydevd называется pydevd-pycharm) и отвечает за взаимодействие со средой выполнения процесса Python (приостановка выполнения, сбор значений переменных и т. д.).
  • Frontend написан на Java и Kotlin, и его обязанности заключаются в отображении кнопок, связанных с отладчиком, в пользовательском интерфейсе PyCharm и отправке команд в Backend через сокеты (например, вы нажимаете Pause в пользовательском интерфейсе отладчика - ›Frontend отправляет команду Pause в Backend).

Когда вы отлаживаете простой скрипт Python в PyCharm, происходит следующее:

  • IDE запускает Frontend - ожидает подключения от Backend
  • IDE запускает Backend и передает ему ваш скрипт
  • Backend делает необходимые приготовления, чтобы иметь возможность взаимодействовать со средой выполнения, и запускает ваш скрипт.
  • Backend подключается к Frontend и ждет команд

Предварительный просмотр решения

Как я уже сказал, мы не можем попросить Backend выполнить ваш код напрямую, но мы можем сделать следующее:

  • Запускаем Frontend в бесконечном цикле
  • Вставьте логику инициализации Backend внутри самой функции
  • Запуск функции Python в Azure
  • Логика инициализации бэкэнда будет выполнена, запустив сам бэкэнд и сделав все необходимые приготовления, чтобы он мог отлаживать функцию.
  • Бэкэнд подключится к Frontend и приостановит выполнение, ожидая ваших команд.
  • Вы можете взаимодействовать с отладчиком Frontend как обычно

Решение в действии

Для этой задачи мы можем использовать конфигурацию запуска сервера отладки Python (верхнее меню «Выполнить» - ›Изменить конфигурации).

введите описание изображения здесь

Он будет использоваться для запуска Frontend отладчика. Укажите случайный порт и скопируйте две строки с вызовом settrace внутри вашей функции. Эти две строки представляют собой логику инициализации Backend. Очевидно, вам понадобится сам пакет Backend (pydevd-pycharm), вы можете установить его с помощью pip на интерпретаторе, используемом функцией. Если вы не можете использовать pip - Backend хранится в папке установки PyCharm - ›папка debug-egg -› pydevd-pycharm.egg. Вы можете сделать Backend доступным во время выполнения, вставив

import sys
sys.path.append("path/to/pydevd-pycharm.egg")

... в вашей функции до import pydevd_pycharm.

В этот момент

  • Запустите конфигурацию запуска (Frontend начнет работать в ожидании Backend)
  • Запустите свою функцию
# ... your func code ...

import sys
sys.path.append("path/to/pydevd-pycharm.egg")
import pydevd_pycharm
pydevd_pycharm.settrace('localhost', port=12345, stdoutToServer=True, stderrToServer=True)

# ... your func code ...
  • На этом этапе должно быть установлено соединение между Frontend и Backend, что позволит вам использовать элементы управления отладчиком из PyCharm для включения / продолжения / приостановки / и т. Д. Выполнения функции.

У меня есть скринкаст, на котором я использую эту функцию для отладки generator3/__main__.py скрипта, запущенного с терминала, пожалуйста, проверьте его https://youtu.be/uYt3G9WEYvo

person Pavel Karateev    schedule 11.12.2020
comment
Простите за стенку текста, надеюсь будет полезно. Как я уже сказал, я никогда не использовал этот подход с функциями Azure Python, но у меня есть успешный опыт его использования для отладки кода веб-серверов, макросов текстовых процессоров и других подобных нетривиальных вещей. - person Pavel Karateev; 11.12.2020