在IPython中运行Flask会引发SystemExit异常

14
我试图在IPython中运行我的Flask应用程序,但是它出现了SystemExit错误。
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, World!'

if __name__ == '__main__':
   app.run(debug=True)

在使用IPython运行此命令时,会显示以下错误:

SystemExit                                Traceback (most recent call last)
<ipython-input-35-bfd7690b11d8> in <module>()
     17 
     18 if __name__ == '__main__':
---> 19    app.run(debug = True)

/Users/ravinderbhatia/anaconda/lib/python2.7/site-packages/flask/app.pyc in run(self, host, port, debug, **options)
    770         options.setdefault('use_debugger', self.debug)
    771         try:
--> 772             run_simple(host, port, self, **options)
    773         finally:
    774             # reset the first request information if the development server

/Users/ravinderbhatia/anaconda/lib/python2.7/site-packages/werkzeug/serving.py in run_simple(hostname, port, application, use_reloader, use_debugger, use_evalex, extra_files, reloader_interval, reloader_type, threaded, processes, request_handler, static_files, passthrough_errors, ssl_context)
    687         from ._reloader import run_with_reloader
    688         run_with_reloader(inner, extra_files, reloader_interval,
--> 689                           reloader_type)
    690     else:
    691         inner()

/Users/ravinderbhatia/anaconda/lib/python2.7/site-packages/werkzeug/_reloader.py in run_with_reloader(main_func, extra_files, interval, reloader_type)
    248             reloader.run()
    249         else:
--> 250             sys.exit(reloader.restart_with_reloader())
    251     except KeyboardInterrupt:
    252         pass

SystemExit: 1
4个回答

36

你正在使用Jupyter Notebook或IPython来运行开发服务器。同时开启了调试模式,该模式默认启用重载器。 重载器尝试重新启动进程,而IPython无法处理。

最好使用flask命令来运行开发服务器。

export FLASK_APP=my_app.py
export FLASK_DEBUG=1
flask run

如果你仍想使用app.run,也可以使用纯python解释器来运行应用程序,但这已不再被推荐。

python my_app.py

如果您想要从Jupyter调用app.run,可以禁用重新加载器。

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

在Visual Studio Code中,要将flask run设置为启动器(而非启动Python),请在.vscode/launch.json中使用以下配置:

    {
      "name": "Python: Flask",
      "type": "python",
      "request": "launch",
      "module": "flask",
      "env": { "FLASK_APP": "my_app.py", "FLASK_ENV": "development" },
      "args": ["run"],
      "args_": ["run", "--no-debugger"],      
      "jinja": true
    }

0

使用这个,对我来说完美地工作:

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


1
但是按照这种方式,您必须重新启动(调试)应用程序,每次进行更改,而不是简单地重新加载页面(因为use_reloader = False)。至少在VS Code中,这是它的行为。 - Alex 75
@Alex75 是的,你说得对。这也是Spyder中的行为。我仍然不知道如何使用debug=True而不会出现SystemExit: 1错误。使用use_realoder=False可以消除错误,但我们会遇到你所评论的问题。 - Murilo

-1

我也遇到了同样的问题,通过移除 debug=True 得以解决。这是我的代码:

from flask import Flask

app=Flask(__name__)

@app.route('/')

def home():
    return "Homepage Here"

if __name__=="__main__":
    app.run()

-1

在Google Colab内,请使用以下内容:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello(): return "Hello World"

import portpicker
port = portpicker.pick_unused_port()
from google.colab import output
output.serve_kernel_port_as_window(port)

from gevent.pywsgi import WSGIServer
host='localhost'
app_server = WSGIServer((host, port), app)
app_server.serve_forever()

一些解释:
  • portpicker - 用于选择随机空闲端口
  • serve_kernel_port_as_window - 将本地主机代理到外部访问链接,该链接将打印在输出中。您可能更喜欢使用output.serve_kernel_port_as_iframe(port)以在iframe中显示
  • gevent.pywsgi - 简单的WSGIServer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接