13

我正在尝试调试使用 FastAPI(uvicorn)的应用程序(Web api)我也在使用诗歌并在 vscode 中设置 projev 虚拟环境。

我阅读了本教程来设置 uvicorn 和教程来设置vscode 但我认为我在设置它时做错了。

我尝试将launch.json设置为python:模块python:当前文件

问题似乎是当我运行调试时它无法识别项目结构原因,它在导入语句中停止并出现此错误:

Exception has occurred: ImportError
attempted relative import with no known parent package

这是我当前的 launch.json 配置:

"configurations": [
    {
        "name": "Python: local debug",
        "type": "python",
        "request": "launch",
        "program": "${workspaceFolder}/src/topic_service/service/__init__.py",
        "args" : ["--port", "8000"]
    },
]

我还尝试添加一个 .env 文件设置 PYTHONPATH:

PYTHONPATH=.:${PYTHONPATH}

我在本地运行应用程序如下:

poetry run uvicorn src.main:app --port 8080 --reload

有谁知道如何正确设置 vscode 来调试 uvicorn 应用程序

谢谢

更新: 我也试过这篇文章所说的。调试器似乎启动了,但什么也没发生(没有触发断点)

4

5 回答 5

27

试试这个配置。

{
    "name": "Python: Module",
    "type": "python",
    "request": "launch",
    "module": "uvicorn",
    "args": ["src.main:app","--reload"]
}
于 2020-04-02T20:12:40.800 回答
17

同样,您在开发 FastAPI 应用程序期间为uvicorn 模块提供了必要的参数,您需要使用相应的值配置您launch.json所在的目录。.vscode

我为自定义项目配置写了一篇文章,以在 VS Code 中调试 FastAPI here

假设您发出以下命令以在 uvicorn 服务器上运行 FastAPI,参数如下所述

uvicorn main:app --reload --port 8000

那么你launch.json应该有一个值为的模块uvicorn,并且每个参数由空格分隔作为args数组的项目。

"module": "uvicorn",
"type": "python",
"request": "launch",
"args": [
    "main:app",
    "--reload",
    "--port",
    "8000"
],
"env": {
    "usersecret": "some$Ecret",
}

您可以拥有此launch.json文件,.vscode然后args根据您的项目结构修改 JSON 配置中的数组。

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: FastAPI",
            "type": "python",
            "request": "launch",
            "module": "uvicorn",
            "env": {
                "db_username": "postgres",
                "db_password": "secret",
                "host_server": "localhost",
                "database_name": "fastapi",
                "ssl_mode": "prefer",
                "db_server_port": "5432"
            },
            "args": [
                "main:app",
                "--reload",
                "--port",
                "8000"
            ]
        }
    ]
}
于 2020-07-14T15:24:01.630 回答
3

快速简便的方法:启动调试器 F5,然后选择FastAPI调试配置:(ps 这适用于 VSCode Insiders;还没有在常规版本上尝试过)

在此处输入图像描述

于 2021-05-08T01:52:03.280 回答
2

对我来说,使用这种配置:

在 VSCode 的 Debug 部分,选择 create launch.json 选项。可能它会像这样在您的根文件夹资源管理器中的 .vscode 文件夹上打开 launch.json ,在 launch.json 里面放这个:

"version": "0.2.0",
  "configurations": [
    {
      "name": "Python: FastAPI",
      "type": "python",
      "request": "launch",
      "module": "uvicorn",
      "cwd": "${workspaceFolder}/<folder to your main.py>",
      "args": [
        "main:app",
        "--reload",
        "--port", //these arg are optional
        "3003"
      ]
    }
  ]
}

现在,只需运行您的调试器,祝您有美好的一天!

编辑: cwd 确保您的调试器将找到您的 main.py 文件的正确路径。因此,对于使用多个调试器或在带有 launch.json 的 vsCode 外部使用的人来说,使用它是一个不错的选择。

于 2021-11-09T16:15:27.290 回答
1

我调试的方式是非常基本的,希望它可以帮助我有这个配置的 .py 文件:

import uvicorn
from app.main import api

if __name__ == "__main__":
    dev = 1
    if dev==0:
        #use this one
        uvicorn.run(api, host="127.0.0.1", port=5000, log_level="info")
    if dev == 1:
        #or this one
        uvicorn.run('app.main:api', host="127.0.0.1", port=5000, log_level="info", reload=True, debug=True)
    if dev == 2:
        uvicorn.run('app.main:api', host="127.0.0.1", port=5000, log_level="info", workers=2)

并使用 vscode 调试器运行文件,重要的是使用 debug 标志运行应用程序,否则调试器会跳过断点(至少在我的情况下)

于 2020-06-06T01:55:15.213 回答