【问题标题】:how debug Azure Python function running in shell and debugging in Intellij IDE如何调试在 shell 中运行的 Azure Python 函数并在 Intellij IDE 中调试
【发布时间】:2020-12-06 11:26:29
【问题描述】:

我是 Azure 新手,不知道如何在 Intellij 项目配置中配置 Azure 运行。

此时我尝试调试我在 shell 中运行的第一个 http-trigger 函数(在 Python 中)并放置调试器点。

问题:执行的函数既不返回响应字符串也不在调试点停止

这是屏幕截图,您可能会看到localhost:7071 成功启动,但是当我尝试使用http://localhost:7071/api/first-http-trigger?name=sdaf 触发我的功能时 它没有响应:Hello, {name}. This HTTP triggered function executed successfully. 并且不会停止调试器

我还为 Intellij 创建了 azure 配置,但它根本没有运行

更新:

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 initfunc newfunc start)

但还有一个问题:调试点不起作用,我无法在 Idea 配置中配置 azure start

【问题讨论】:

  • 你能分享你的function.json文件吗?
  • @AntonKomyshan 添加了function.json

标签: azure intellij-idea configuration azure-functions azure-functions-core-tools


【解决方案1】:

但还有一个问题:调试点不起作用, 我无法在 Idea 配置中配置 azure start

func init,func new,func start,这三样东西本质上就是控制台命令。它只能确保您可以运行函数应用。

对于 Intellij IDEA 和 VS Code,关键是扩展,或者说插件。首先,您需要获得对这种语言的支持。然后你需要一个插件来调试。对于 VS Code,它是“天蓝色功能扩展”。对于 Intellij IDEA,它是“Intellij 的 Azure 工具包”。 VS Code 的“azure 功能扩展”可以支持多种语言。但是对于'Azure Toolkit for Intellij',不幸的是,它专注于Java(如果你想用它来调试函数应用程序,你会发现你无法选择任何模块。这是因为它没有认为你的函数应用程序是一个java项目。)

建议你使用VS Code在本地开发函数应用,这样你就可以获得所有语言的函数应用的调试支持。(如果你使用VS Code,你只需要两个东西,一个是python插件,另一个是是天蓝色的功能扩展插件,然后就可以调试了。)

【讨论】:

  • 你知道,这是一个问题,MS 不想很好地支持 Idea 产品,因此他们强制使用 VSCode,但我宁愿去 AWS 并在 Intellij 中获得相当好的工具包,而不是改变我的工作环境
【解决方案2】:

不幸的是,仅当包含断点的代码通过调试器下的运行配置执行时,PyCharm 才会考虑断点。在终端启动时 - 它只是一些 IDE 不太了解的进程。

确实不是很方便,因为有些情况下你不能直接在IDE中执行代码,所以PyCharm有一个特殊的功能叫做Python Debug Server

我应该承认我没有尝试将它与 Azure Python 函数一起使用。

调试器架构

为了更好地理解,让我们回顾一下调试器在 PyCharm 中的工作原理。它由两部分组成 - 后端和前端:

  • 后端是用 Python 编写的(pydevd 的分支,称为 pydevd-pycharm),负责与 Python 进程运行时交互(暂停执行、收集变量值等)。
  • 前端是用 Java 和 Kotlin 编写的,它的职责是在 PyCharm 的 UI 中显示与调试器相关的按钮,并通过套接字向后端发送命令(例如,您在调试器 UI 中单击“暂停”-> 前端向后端发送“暂停”命令) .

当您在 PyCharm 中调试一个简单的 Python 脚本时,会发生以下情况:

  • IDE 启动前端 - 它等待来自后端的连接
  • IDE 启动后端并将您的脚本传递给它
  • 后端进行必要的准备,以便能够与运行时交互并启动您的脚本
  • 后端连接到前端并等待命令

解决方案预览

正如我所说,我们不能要求后端直接执行您的代码,但我们可以做的是

  • 无限循环启动前端
  • 在函数内部插入后端初始化逻辑
  • 触发 Azure Python 函数
  • 将执行后端初始化逻辑,启动后端本身并为其调试功能做所有必要的准备
  • 后端将连接到前端并暂停执行以等待您的命令
  • 您可以像往常一样与前端调试器交互

实际解决方案

对于这个任务,我们可以使用“Python Debug Server”运行配置(运行顶部菜单 -> 编辑配置)

它将用于启动调试器前端。指定一些随机端口并在函数内使用settrace 调用复制两行。这两行是后端初始化逻辑。您显然需要后端包本身(pydevd-pycharm),您可以在函数使用的解释器上使用pip 安装它。如果您不能使用 pip - 后端存储在 PyCharm 安装文件夹 -> debug-eggs 文件夹 -> pydevd-pycharm.egg 中。您可以通过插入使后端在运行时可用

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

...在import pydevd_pycharm之前的函数中。

此时

  • 开始运行配置(前端将开始运行等待后端)
  • 触发你的函数
# ... 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 ...
  • 此时应建立前端和后端之间的连接,允许您使用 PyCharm 中的调试器控件来单步执行/继续/暂停/等函数执行。

我有一个截屏视频,我使用此功能调试从终端启动的generator3/__main__.py 脚本,请随时查看https://youtu.be/uYt3G9WEYvo

【讨论】:

  • 对不起文字墙,希望有用。正如我所说,我从未在 Azure Python Functions 中使用过这种方法,但我在使用它来调试 Web 服务器、文字处理器宏和其他类似的重要内容背后的代码方面拥有成功的经验。
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多