【问题标题】:Flask debug mode gives an "OSError: [Errno 8] Exec format error" when running using python使用 python 运行时,Flask 调试模式会给出“OSError: [Errno 8] Exec format error”
【发布时间】:2019-03-24 09:03:42
【问题描述】:

所以,这是我制作的文件(flaskblog.py):

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1>Home Page</h1>"

这是我第一次运行它的方式:

$ export FLASK_APP=flaskblog.py
$ flask run

这是我在调试模式下运行它的方式:

$ export FLASK_APP=flaskblog.py
$ export FLASK_DEBUG=1
$ flask run

现在我想直接使用 python 运行应用程序。我首先更新了 .py 文件:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1>Home Page</h1>"

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

这是我用来运行python文件的命令:

$ python3 flaskblog.py

效果很好。现在我想在调试模式下运行应用程序。所以,我更新了文件:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1>Home Page</h1>"

if __name__ == "__main__":
    app.run(debug=True) #Added ("debug=True") here

用于运行文件的命令:

$ python3 flaskblog.py

这是错误:

 * Serving Flask app "flaskblog" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
Traceback (most recent call last):
  File "flaskblog.py", line 9, in <module>
    app.run(debug=True)
  File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 943, in run
    run_simple(host, port, self, **options)
  File "/usr/local/lib/python3.6/dist-packages/werkzeug/serving.py", line 988, in run_simple
    run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
  File "/usr/local/lib/python3.6/dist-packages/werkzeug/_reloader.py", line 332, in run_with_reloader
    sys.exit(reloader.restart_with_reloader())
  File "/usr/local/lib/python3.6/dist-packages/werkzeug/_reloader.py", line 176, in restart_with_reloader
    exit_code = subprocess.call(args, env=new_environ, close_fds=False)
  File "/usr/lib/python3.6/subprocess.py", line 267, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/lib/python3.6/subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1344, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: '/XXX/XXX/XXX/XXX/XXX/XXX/XXX/XXX/Flask_Blog/flaskblog.py'

我只是使用“XXX”而不是实际目录。任何帮助将不胜感激!

PS:所有代码均来自该视频:https://www.youtube.com/watch?v=MwZwr5Tvyxo&list=PL-osiE80TeTs4UjLw5MM6OjgkjFeUxCYH

【问题讨论】:

  • 我只是按照您提到的步骤操作,它在我的机器上运行良好。您使用的是什么操作系统?另外,您是否尝试过删除整个目录并使用新的虚拟环境从头开始?
  • 我认为你应该这样做,不管怎样,使用虚拟环境通常是个好主意,因为它们可以让你处理具有不同依赖项的多个 Python 项目。总体而言,这是一种更清洁的方法。不能确定它会解决您的问题,但尝试一下不会有什么坏处。
  • 编辑文件.../python3.6/site-packages/werkzeug/_reloader.py(使用堆栈跟踪获取完整路径)并在第176行(exit_code = ...行)之前添加一条新语句print('args: {!r}'.format(args)),然后再试一次.你在输出中看到了什么?
  • 这很奇怪,我在我的系统上看到了['/path/to/python3', '/path/to/flaskblog.py']。看起来它正在尝试直接在您的系统上运行 ./flaskblog.py 而不是 python3 flaskblog.py。您可以尝试在 flaskblog.py 中添加一个 shebang (#!/usr/bin/env python3),使文件可执行 (chmod +x flaskblog.py),然后再试一次?
  • @Sumit 哇!有用!非常感谢。为什么它试图直接运行它而不是python3 flaskblog.py

标签: python-3.x flask


【解决方案1】:

看起来 Flask 出于某种原因正在尝试直接运行 ./flaskblog.py,而不是使用 python 二进制文件 (python3 flaskblog.py),因为 flaskblog.py 不可执行,所以它不起作用。

所以只需在 flaskblog.py 的顶部添加以下行 (shebang)

#!/usr/bin/env python3

...并使文件可执行:

chmod +x flaskblog.py

然后再试一次,使用python3 flaskblog.py 或直接使用./flaskblog.py

【讨论】:

  • 如何在 Windows 上的 Docker 上运行它?我相信这里没有chmod 命令?如何在容器内运行这样的命令?
  • @Piotrek 我从来没有使用过 Docker,但是快速的 Google 搜索表明将 RUN ["chmod", "+x", "flaskblog.py"] 添加到您的 Dockerfile 中可能有用吗?
  • 是的,我也发现了。这是一个链接:github.com/pallets/werkzeug/issues/1482#issuecomment-477437009 无论如何谢谢!
  • 我使用了 virtualenv,我也遇到了这个问题。运行chmod 644 app.py 解决了这个问题。
  • 任何使用 Docker 和 Flask 遇到此问题的人 - 不要尝试直接运行应用程序 (python app.py)。而是在 Dockerfile 中使用 'CMD ["flask", "run", "--host=0.0.0.0", "--port=80"]`(如果要公开端口 80)。
【解决方案2】:

我只是将 .py 文件的权限从 775 更改为 664,实质上是从权限中删除了“x”。

更改自:

-rwxrwxr-x 1 ubuntu ubuntu 

到:

-rw-rw-r-- 1 ubuntu ubuntu 

【讨论】:

    猜你喜欢
    • 2019-08-11
    • 2017-08-02
    • 2020-02-23
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2016-12-14
    • 2018-11-12
    • 2016-04-15
    相关资源
    最近更新 更多