pycharm 和 Flask 自动重载和断点不起作用

问题描述 投票:0回答:7

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

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

app.run(debug=True)

我的断点被忽略。经过一番谷歌搜索后,我发现为了让 PyCharm 在断点处停止,我应该运行 Flask:

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

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

有什么办法可以让两者一起工作吗?

使用 python 2.7 这两件事都可以工作

我向 PyCharm 报告了此问题:https://youtrack.jetbrains.com/issue/PY-13976

python flask pycharm
7个回答
26
投票

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

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

在我看来,解决这个问题的最好方法是要求 Jetbrains 在他们的 IDE 中构建“更改时重新启动”功能。那么您根本不需要使用 Werkzeug 的重新加载器,并且可以直接从 PyCharm 获得相同的功能。

在 Jetbrains 决定实施此操作之前,我可以分享我的解决方法,这并不是很糟糕。

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

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

祝你好运!


7
投票

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

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


2
投票

在我的设置中,我通过运行

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

我的问题是我需要检查

Run with Python console


1
投票

问题是因为使用

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')

1
投票

您需要解锁控制台。

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

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

  1. 转到 localhost:5000/console 并在开始时在控制台中输入 PIN Flask 打印
  2. 将此 PIN 码复制粘贴到控制台中,然后单击确认 PIN 码
  3. 现在断点可以工作了

0
投票

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


-1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.