【问题标题】:How does one use the VSCode debugger to debug a Gunicorn worker process?如何使用 VSCode 调试器来调试 Gunicorn 工作进程?
【发布时间】:2016-10-04 00:25:00
【问题描述】:

我有一个在 Ubuntu 14.04 上用 Python 3.4 编写的 GUnicorn/Falcon Web 服务。我想使用 VSCode 调试器来调试这个服务。我目前使用命令

启动该过程
/usr/local/bin/gunicorn --config /webapps/connects/routerservice_config.py routerservice:api

使用配置文件 routerservice_config.py 启动 routerservice.py。为了简单起见,我在配置中将工作人员设置为 1。

我已将 Python 扩展安装到 VSCode,因此我拥有 Python 调试工具。那么如何附加到 GUnicorn 工作进程或让 VSCode 运行启动命令并自动附加。

谢谢, 格雷格

【问题讨论】:

  • 您的 launch.json 配置如何?

标签: python debugging visual-studio-code gunicorn


【解决方案1】:

这个 launch.json 设置在 VScode 1.43 上对我有用:

{
    "name": "Python: Webapp",
    "type": "python",
    "request": "launch",
    "program": "/home/me/.virtualenvs/my-venv/bin/gunicorn",
    "gevent": true,
    "args": ["main:app", "--bind=127.0.0.1:8080", "--reload", "--worker-class", "eventlet", "-w", "1", "--timeout=7200"],
    "postDebugTask": "killdebugger"
}

使用此设置,我必须在停止调试器后创建一个用于终止 python 进程的任务。这仅仅是因为按下停止按钮只会关闭调试器本身,而 Python 进程将继续运行。如果你遇到同样的情况,按F1创建一个任务,搜索任务然后点击“配置任务”。然后将以下命令添加到您的 tasks.json:

{
    "label": "killdebugger",
    "type": "shell",
    "command": "lsof -t -i tcp:8080 | xargs kill -9"
}

如果您没有遇到此问题,请从 launch.json 中删除"postDebugTask": "killdebugger" 设置

【讨论】:

    【解决方案2】:

    我是扩展程序的作者。 您可以尝试以下方法: https://github.com/DonJayamanne/pythonVSCode/wiki/Debugging:-Remote-Debuging

    • 将以下代码添加到您的 routerservice_config.py(或类似的 python 启动文件)中 import ptvsd ptvsd.enable_attach("my_secret", address = ('0.0.0.0', 3000))
    • 启动上述应用程序
    • 进入 VS Code,然后附加调试器

    仅供参考:
    - 这需要您在应用程序中包含 ptvsd 包并对其进行配置。
    - 计划是在未来(希望在不久的将来)添加将调试器附加到任何 python 进程的功能。

    【讨论】:

    • 现在叫 debugpy 吗?
    【解决方案3】:

    您会在这里找到我的 .vscode/launch.json 设置在 Windows 10/VScode 1.60.0 上对我有用,主要本地化在 app/main.py 中:

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python : app.main",
                "cwd": "${workspaceFolder}",
                "type": "python",
                "request": "launch",
                "program": "app/venv/fastapi/Scripts/uvicorn.exe",
                "args": ["app.main:app", "--host=127.0.0.1", "--port=8000", "--reload", "--log-level=error" ],
                "console": "integratedTerminal",
                "postDebugTask": "killdebugger"
            }
        ]
    }
    

    以及相应的 .vscode/tasks.json 以在调试退出时终止服务器:

    {
        "version": "2.0.0",
        "tasks": [
            {
                "label": "killdebugger",
                "type": "shell",
                "command": "netstat -nao | grep \"8000\"|awk '{ print $5 }'| xargs kill -9"
            }
        ]
    }
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到更多关于如何写出好的答案的信息。 ——
    【解决方案4】:

    我遇到了同样的问题,并按照此处描述的公认答案解决了它:Is it possible to run Falcon app from Python?

    由于gunicorn fork 你的进程,用VScode 调试器拦截它并不是那么简单。最简单的方法是直接使用 python 调用您的 API

    from wsgiref import simple_server
    import os
    import falcon
    
    app = falcon.API()
    
    if __name__ == '__main__':
        with simple_server.make_server('', int(os.getenv('PORT', 5000)), app) as httpd:
            httpd.serve_forever()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-21
      • 2019-05-06
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 2019-05-02
      • 1970-01-01
      相关资源
      最近更新 更多