Estoy ejecutando una aplicación Flask con un script personalizado . O tratando de hacerlo, de todos modos.
Estoy en Windows 10 y la aplicación debería ejecutarse en un contenedor Docker de Linux con el comando:
docker-compose up api Docker-compose es version 1.23.2 . En el dockerfile, el servicio api se ejecuta a través del comando:
command: python manage.py run --host "0.0.0.0" --with-threadsMientras intenta iniciarse, veo la excepción.
OSError: [Errno 8] Exec format error: '/api/manage.py' Inicialmente pensé que serían los temidos finales de línea de Windows, ven por mí una vez más, pero ejecutar dos2unix en todos mis archivos fuente no ha resuelto el problema.
¿Cómo puedo evitar este error?
gestionar.py
import click from flask.cli import FlaskGroup from my_app_api import create_app def create_my_app(info): return create_app() @click.group(cls=FlaskGroup, create_app=create_my_app) def cli(): pass if __name__ == "__main__": cli()Rastreo completo
api_1 | Traceback (most recent call last): api_1 | File "manage.py", line 22, in <module> api_1 | cli() api_1 | File "/usr/local/lib/python3.6/site-packages/click/core.py", line 764, in __call__ api_1 | return self.main(*args, **kwargs) api_1 | File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 380, in main api_1 | return AppGroup.main(self, *args, **kwargs) api_1 | File "/usr/local/lib/python3.6/site-packages/click/core.py", line 717, in main api_1 | rv = self.invoke(ctx) api_1 | File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1137, in invoke api_1 | return _process_result(sub_ctx.command.invoke(sub_ctx)) api_1 | File "/usr/local/lib/python3.6/site-packages/click/core.py", line 956, in invoke api_1 | return ctx.invoke(self.callback, **ctx.params) api_1 | File "/usr/local/lib/python3.6/site-packages/click/core.py", line 555, in invoke api_1 | return callback(*args, **kwargs) api_1 | File "/usr/local/lib/python3.6/site-packages/click/decorators.py", line 64, in new_func api_1 | return ctx.invoke(f, obj, *args, **kwargs) api_1 | File "/usr/local/lib/python3.6/site-packages/click/core.py", line 555, in invoke api_1 | return callback(*args, **kwargs) api_1 | File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 438, in run_command api_1 | use_debugger=debugger, threaded=with_threads) api_1 | File "/usr/local/lib/python3.6/site-packages/werkzeug/serving.py", line 988, in run_simple api_1 | run_with_reloader(inner, extra_files, reloader_interval, reloader_type) api_1 | File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 332, in run_with_reloader api_1 | sys.exit(reloader.restart_with_reloader()) api_1 | File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 176, in restart_with_reloader api_1 | exit_code = subprocess.call(args, env=new_environ, close_fds=False) api_1 | File "/usr/local/lib/python3.6/subprocess.py", line 287, in call api_1 | with Popen(*popenargs, **kwargs) as p: api_1 | File "/usr/local/lib/python3.6/subprocess.py", line 729, in __init__ api_1 | restore_signals, start_new_session) api_1 | File "/usr/local/lib/python3.6/subprocess.py", line 1364, in _execute_child api_1 | raise child_exception_type(errno_num, err_msg, err_filename) api_1 | OSError: [Errno 8] Exec format error: '/api/manage.py'Este es un nuevo comportamiento en Werkzeug 0.15. La degradación a Werkzeug 0.14.1 puede funcionar, pero 0.14 ya no es compatible, por lo que será mejor que corrija el problema con su archivo como se describe en las otras respuestas.
La respuesta de @CristiFati me funcionó con 1 paso adicional:
También tuve que corregir el EOL de \r\n a \n .
Lo siento, no tengo suficientes puntos para agregar un comentario y tengo que abrir una nueva respuesta ...
Si deshabilita el modo de depuración (no pase debug=True o configure FLASK_DEBUG=0 ), el recargador no se utilizará y, por lo tanto, este problema no ocurrirá. La compensación es que ya no tienes el recargador.
if __name__ == "__main__": connexion_app.run(host="0.0.0.0", port=constants.API_PORT, debug=True) Es preferible arreglar esto asegurándose de que los archivos marcados como ejecutables tengan una línea de interpretación, como #!/usr/bin/env python3 (de https://stackoverflow.com/a/55272071 ).
Werkzeug==0.15.4 tiene esta pregunta。
pip install --user Werkzeug==0.16