pycharm和flask自动转载和断点不工作

2024-05-01 21:54:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是Pycharm 4,带烧瓶0.10.1,python 3.4

从pycharm内部运行烧瓶应用程序时,如果使用以下命令运行:

app.run(debug=True)

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

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

现在PyCharm正确地在断点处停止,但是我错过了自动转载功能。

有没有办法让这两种方法一起工作?

使用Python2.7这两种方法都有效

我把这个报告给了皮查姆:https://youtrack.jetbrains.com/issue/PY-13976


Tags: 方法rundebug命令trueapp应用程序flask
3条回答

我将从一个简短的答案开始:不,任何版本的PyCharm到4.0.1都无法满足您的需求。

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

在我看来,解决这个问题的最好方法是让Jetbrains在他们的IDE中构建一个“重启改变”特性。那么你根本不需要使用Werkzeug的重载器,你可以直接从PyCharm获得相同的功能。

在Jetbrains决定实施之前,我可以分享我的解决方案,这并不是非常糟糕。

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

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

祝你好运!

问题是,使用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')

我发现在PyCharm 2018.1.2中,运行配置中有FLASK_DEBUG checbox:enter image description here

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

相关问题 更多 >