【问题标题】:How to debug flask.app with pycharm 2.x that's running on gunicorn如何使用在 gunicorn 上运行的 pycharm 2.x 调试 flask.app
【发布时间】:2014-01-11 01:03:38
【问题描述】:

我正在开发一个 flask.app,它使用 Web 套接字功能并安装了 flask-socket 来提供它。所以flask-socket 开发者推荐gunicorn 作为Web 服务器。我现在的问题是如何将pycharm的remove调试器和gunicorn连接起来,用断点拦截执行。

【问题讨论】:

    标签: python flask pycharm


    【解决方案1】:

    Settings > Project Settings > Python Debugger

    其中有一个选项可以启用“gevent 兼容调试”。

    然后,进入您的调试器设置(快捷方式是通过工具栏,单击播放/调试图标附近的下拉菜单并选择“编辑配置”

    将“脚本”设置为您的 virtualenv 的 gunicorn 安装,类似于:

    /Users/iandouglas/.virtualenvs/defaultenv/bin/gunicorn

    将“脚本参数”设置为类似 -b 192.168.1.1:9000 app:yourappname(假设您的主要启动脚本名为 app.py 并且您将其称为 'yourappname'

    “工作目录”将自动设置,否则将其设置为您的代码所在的任何位置:/Users/iandouglas/PycharmProjects/MyExampleApp

    我的 gunicorn 设置有一个单独的配置文件,它指定了主机/端口,但我仍然必须指定 -b 0.0.0.0:5001 参数以强制 gunicorn 绑定到我机器上端口 5001 上的所有 IP。

    附言

    here所指出的那样,一个重要的步骤是添加这个环境变量

    PYDEVD_USE_CYTHON=NO
    

    【讨论】:

    • 在 PyCharm 2.7.3 中,Settings > Project Settings > Python Debugger 下只有两个选项:“调试时自动附加到子进程”和“收集运行时类型信息以了解代码”。您是否安装了其他插件?
    • 不,我的编辑器中一直有“gevent 兼容调试”,无论是 v2 还是 v3。我确实使用专业版...也许他们没有将其包含在免费的社区版中。
    • CE 3.4 版在@arbyter 提到的其他两个选项旁边有Gevent compatible debugging
    • 这是一篇旧帖子,但对某些人仍有帮助。如果在调试过程中,进程突然重启,那是因为 gunicorn worker 超时。您可以将其设置得更高以获得更长的调试时间,将--timeout INT 用于您的脚本参数。
    • 这在最近的版本中似乎不起作用。在我的情况下,执行不会在断点处停止
    【解决方案2】:

    我的 PyCharm 2018.1.3 Professional 案例:

    1. 转到运行/调试配置 creating-and-editing-run-debug-configurations

    2. 选择新的“Python”配置

    3. 脚本路径:your_path_to_/venv/bin/gunicorn
    4. 参数(对我来说):-b :5001 --access-logfile - --error-logfile - "run:create_application()"
    5. Python 解释器:项目的 venv python 版本
    6. 工作目录:项目路径
    7. 保存并按 DEBUG (Shift+F9)
    8. 快乐!

    【讨论】:

      【解决方案3】:

      我试图在 Pycharm 2020.2.1 上进行调试,即使启用了与 Gevent 兼容的调试,断点也无法正常工作。事实证明,我必须按照here 的描述设置环境变量来为我的运行配置禁用 Cython 才能使其工作。

      PYDEVD_USE_CYTHON=NO
      

      【讨论】:

      • 你是我的救星@Philipp!
      【解决方案4】:
      • 编辑烧瓶启动 python 文件
      $ vim manage.py
      
      • 删除调试选项设置
      from web import app
      import sys
      
      if __name__ == '__main__':
          # app.run(host='0.0.0.0', port=app.config["PORT"], debug=app.config["DEBUG"])
          app.run(host='0.0.0.0', port=9998, debug=False)
      

      【讨论】:

        猜你喜欢
        • 2023-02-11
        • 2018-02-22
        • 2017-10-04
        • 2018-01-15
        • 1970-01-01
        • 2018-08-29
        • 2022-07-07
        • 2015-01-31
        • 2019-12-27
        相关资源
        最近更新 更多