【问题标题】:pycharm and flask autoreload and breakpoints not workingpycharm和flask自动重载和断点不起作用
【发布时间】:2015-01-21 03:08:34
【问题描述】:

我正在使用 Pycharm 4,flask 0.10.1,python 3.4

似乎从 pycharm 内部运行烧瓶应用程序时,如果我运行它:

app.run(debug=True)

我的断点被忽略了。经过一番谷歌搜索,我发现为了让 PyC​​harm 在断点处停止,我应该运行烧瓶:

app.run(debug=True, use_reloader=False)

现在 PyCharm 在断点处正确停止,但我错过了自动重新加载功能。

有没有办法让两者一起工作?

使用 python 2.7 两种方法都可以

我将此报告给 PyCharm:https://youtrack.jetbrains.com/issue/PY-13976

【问题讨论】:

  • Flask 文档强烈建议在这个阶段不要使用 Python 3:flask.pocoo.org/docs/0.10/advanced_foreword/…
  • @Kash:这个问题与 Python 3 无关。作为旁注,文档中的警告非常具有误导性,Armin 在 Flask 中支持 Python 3 方面做得很好,发布0.10.1 在 Python 3.3 和 3.4 上非常稳定。
  • @Miguel 啊,我明白了,我的错。感谢您的澄清。

标签: python flask pycharm


【解决方案1】:

我将从简短的回答开始:不,您想要的任何 PyCharm 4.0.1 版本都无法完成。

问题在于,当您使用重新加载器时,Flask 应用程序在子进程中运行,因此 PyCharm 调试器附加到主进程并且无法控制子进程。

在我看来,解决此问题的最佳方法是要求 Jetbrains 在其 IDE 中构建“更改时重启”功能。然后,您根本不需要使用 Werkzeug 的重新加载器,您可以直接从 PyCharm 获得相同的功能。

在 Jetbrains 决定实施之前,我可以分享我的解决方法,这还不错。

  • 在“编辑配置”中,将您要使用的配置设置为“仅单实例”(对话框右上角的复选框)
  • 确保配置是活动的。
  • 将您的 Flask 应用程序配置为不使用 Werkzeug 重新加载器。
  • 按 Ctrl-D 开始调试(在 Mac 上,其他人可能有不同的快捷键)
  • 断点应该可以正常工作,因为重新加载器未处于活动状态。
  • 进行任何您需要的代码更改。
  • 当您准备好重新启动时,再次按 Ctrl-D。第一次执行此操作时,您会收到确认提示,例如“停止并重新启动?”。说是,然后选中“不再显示”复选框。
  • 现在您可以在需要时按 Ctrl-D 快速重新启动调试器。

我同意它并不完美,但是一旦 Ctrl-D 进入你的肌肉记忆,你甚至都不会去想它。

祝你好运!

【讨论】:

  • 这个问题的最新答案是什么?
  • @mLstudent33 据我所知没有变化。
【解决方案2】:

我发现在 PyCharm 2018.1.2 中运行配置中有 FLASK_DEBUG 复选框:

在进行一些更改后,保存文件会触发重新加载操作。

【讨论】:

    【解决方案3】:

    在我的设置中,我通过运行 main.py 文件来调试烧瓶应用程序,该文件设置一些配置并调用 app.run()。我的 python 解释器设置在 Docker 容器中。

    我的问题是我需要检查Run with Python console

    【讨论】:

      【解决方案4】:

      问题是因为use_reloader=True werkzeug 应用程序是在主应用程序的单独(子)线程中启动的,而 PyCharm 无法正确处理断点,因为它们在线程启动时丢失。

      您可以尝试关注此主题:http://forum.jetbrains.com/thread/PyCharm-776,但似乎没有太多进展。

      我建议使用类似 Python 的东西,例如 pdb,即:

      @app.route('/<string:page>')
      def main(page):
         import pdb; pdb.set_trace()  # This line actually stops application execution
                                      # and starts Python debug shell in the console
                                      # where you can examine current scope and continue
                                      # normal code execution at any time.
                                      # You can inject *any* code here.
                                      # For example, if you type `print page` during pause,
                                      # it will output content of "page" variable.
         return render_template('index.html')
      

      【讨论】:

      • @AndrewDunai:您的声明“werkzeug 应用程序在单独的(子)线程中启动”不正确。 Werkzeug 将应用程序作为子进程启动。在 PyCharm 中设置的断点工作得很好,但它们从来没有碰到正在调试的进程,因为应用程序没有在那里运行,子进程在 PyCharm 的控制之外运行应用程序。
      【解决方案5】:

      尝试在“编辑配置”中配置此 python 运行配置。之后,在调试模式下运行。

      【讨论】:

        【解决方案6】:

        您需要解锁控制台。

        1. 您在调试模式下启动应用程序

        1. 然后你做了一些导致错误的事情。
        2. Flask 的错误消息的末尾是这样的

        1. 在这里,您在控制台中输入 PIN 瓶打印件开始
        2. 将此密码复制粘贴到控制台并点击确认密码
        3. 现在断点可以工作了

        【讨论】:

          【解决方案7】:

          从 pycharm 2017 开始使用 python 2.7(在我的情况下使用虚拟环境,但我认为没有必要)我这样做:

          • 运行...
          • 将脚本和脚本参数留空
          • 我输入了解释器选项:-m flask run
          • 设置环境变量 FLASK_APP

          • 比运行attach到本地进程,最后选择正在运行的进程

          我的用例是从邮递员连接到烧瓶休息服务端点并在我的断点处中断

          【讨论】:

            猜你喜欢
            • 2017-07-10
            • 1970-01-01
            • 2016-12-07
            • 2019-11-20
            • 1970-01-01
            • 2014-08-10
            • 1970-01-01
            • 1970-01-01
            • 2015-11-20
            相关资源
            最近更新 更多