Режим отладки Flask выдает «OSError: [Ошибка 8] Exec format error» при запуске с использованием python

#python-3.x #flask

#python-3.x #flask

Вопрос:

Итак, вот файл, который я создал (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=MwZwr5Tvyxoamp;list=PL-osiE80TeTs4UjLw5MM6OjgkjFeUxCYH

Комментарии:

1. Я просто выполнил шаги, которые вы упомянули, и это отлично работает на моей машине. Какую ОС вы используете? Кроме того, вы пытались удалить весь каталог и начать с нуля, с новой виртуальной средой?

2. Я думаю, вам следует, обычно в любом случае рекомендуется использовать виртуальные среды, поскольку они позволяют вам работать над несколькими проектами Python с разными зависимостями. В целом это гораздо более чистый подход. Не уверен, что это решит вашу проблему, но попробовать не помешает.

3. Отредактируйте файл .../python3.6/site-packages/werkzeug/_reloader.py (используйте трассировку стека, чтобы получить полный путь) и, прямо перед строкой 176 ( exit_code = ... строка), добавьте новую инструкцию print('args: {!r}'.format(args)) , затем повторите попытку. Что вы видите на выходе?

4. Это странно, я видел ['/path/to/python3', '/path/to/flaskblog.py'] в моей системе. Похоже, что он пытается запуститься ./flaskblog.py непосредственно в вашей системе, а не python3 flaskblog.py . Можете ли вы попробовать добавить shebang ( #!/usr/bin/env python3 ) в flaskblog.py сделайте файл исполняемым ( chmod x flaskblog.py ) и повторите попытку?

5. @Sumit Вау! Это работает! Большое вам спасибо. Почему он пытался запустить его напрямую, а не python3 flaskblog.py ?

Ответ №1:

Похоже, что Flask по какой-то причине пытается выполнить ./flaskblog.py напрямую, а не с помощью двоичного файла python ( python3 flaskblog.py ), который с тех пор не работает flaskblog.py не является исполняемым.

Поэтому просто добавьте следующую строку (shebang) в верхней части flaskblog.py

 #!/usr/bin/env python3
  

… и сделайте файл исполняемым:

 chmod  x flaskblog.py
  

Затем повторите попытку либо с помощью python3 flaskblog.py , либо напрямую как ./flaskblog.py .

Комментарии:

1. Как запустить его в Docker в Windows? Здесь, я полагаю, нет chmod командования? Как запускать такие команды внутри контейнера?

2. @Piotrek Я никогда не использовал Docker, но быстрый поиск в Google подсказывает, что добавление RUN ["chmod", " x", "flaskblog.py"] в ваш файл Dockerfile может сработать?

3. Да, я только что нашел и это тоже. Вот ссылка: github.com/pallets/werkzeug/issues/1482#issuecomment-477437009 В любом случае спасибо!

4. Я использую virtualenv, и у меня тоже возникла эта проблема. Запуск chmod 644 app.py решил проблему.

5. Любой, кто сталкивается с этой проблемой, используя Docker и Flask — не пытайтесь запускать приложение напрямую ( python app.py ). Вместо этого используйте ‘CMD [«flask», «run», «—host=0.0.0.0», «—port = 80»]` в вашем Dockerfile (если вы предоставляете доступ к порту 80).

Ответ №2:

Я просто изменил разрешения для файла .py с 775 на 664, по сути удалив ‘x’ из разрешений.

Изменил его с:

 -rwxrwxr-x 1 ubuntu ubuntu 
  

Для:

 -rw-rw-r-- 1 ubuntu ubuntu