pycharm和flask autoreload和断点不起作用

Mat*_*att 20 python pycharm flask

我正在使用Pycharm 4,烧瓶0.10.1,python 3.4

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

app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

我的断点被忽略了.经过一些谷歌搜索,我发现为了让PyCharm停在断点上,我应该运行烧瓶:

app.run(debug=True, use_reloader=False)
Run Code Online (Sandbox Code Playgroud)

现在PyCharm在断点上正确停止,但我错过了自动加载功能.

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

使用python 2.7这两件事都有效

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

Mig*_*uel 20

我将从简短的回答开始:不,你想要的任何版本的PyCharm都不能用到4.0.1.

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

在我看来,解决这个问题的最好方法是让Jetbrains在他们的IDE中构建一个"重启更改"功能.然后你根本不需要使用Werkzeug的重新加载器,你可以直接从PyCharm获得相同的功能.

直到Jetbrains决定实施这个,我可以分享我的解决方法,这不是非常糟糕.

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

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

祝好运!


kla*_*xon 7

我发现在 PyCharm 2018.1.2 中运行配置中有 FLASK_DEBUG 复选框:在此处输入图片说明

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


And*_*nai 1

问题是因为use_reloader=Truewerkzeug 应用程序是在主应用程序的单独(子)线程中启动的,而 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')
Run Code Online (Sandbox Code Playgroud)

  • @AndrewDunai:您的陈述“werkzeug 应用程序是在单独的(子)线程中启动的”是不正确的。Werkzeug 将应用程序作为子进程启动。PyCharm 中设置的断点工作得很好,但它们永远不会在正在调试的进程中命中,因为应用程序不在那里运行,子进程在 PyCharm 的控制之外运行应用程序。 (3认同)