我正在使用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
我将从简短的回答开始:不,您想要的任何 PyCharm 4.0.1 版本都无法完成。
问题是,当您使用重新加载器时,Flask 应用程序在子进程中运行,因此 PyCharm 调试器附加到主进程并且无法控制子进程。
在我看来,解决这个问题的最好方法是要求 Jetbrains 在他们的 IDE 中构建“更改时重新启动”功能。那么您根本不需要使用 Werkzeug 的重新加载器,并且可以直接从 PyCharm 获得相同的功能。
在 Jetbrains 决定实施此操作之前,我可以分享我的解决方法,这并不是很糟糕。
我同意它并不完美,但是一旦 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')
设置环境变量FLASK_APP
然后运行attach到本地进程,最后选择正在运行的进程
我的用例是从邮递员连接到烧瓶休息服务端点并中断我的断点