Python >> Tutoriel Python >  >> Python Tag >> exec()

Flask CLI lance 'OSError:[Errno 8] Exec format error' lorsqu'il est exécuté via docker-compose

Ressemble à votre api/manage.py n'a pas de shebang ([Wikipedia] :Shebang (Unix)), donc le processeur de commandes par défaut (actuel) (un shell - typiquement bash ) tente de l'exécuter, ce qui (évidemment) échoue.

Pour corriger le problème, ajoutez un shebang (au début du fichier, en veillant à ce que votre éditeur ajoute le Nix fin de ligne de style (\n , 0x0A , LF )):

  • Python par défaut mise en place :

      #!/usr/bin/env python
    
    • Variante (spécifiez Python 3 explicitement):

        #!/usr/bin/env python3
      
  • Python personnalisé mise en place :

      #!/full/path/to/your/custom/python/executable
    

Notez que vous avez également besoin de exec autorisations sur le fichier (chmod +x api/manage.py ).

Exemple :

[[email protected]:/cygdrive/e/Work/Dev/StackOverflow/q055271912]> ~/sopr.sh
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***

[prompt]> ls
code00.py  code01.py
[prompt]>
[prompt]> cat code00.py
print("This is:", __file__)

[prompt]> python3 -c "import os, subprocess;subprocess.Popen(os.path.join(os.getcwd(), \"code00.py\")).communicate()"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  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: '/cygdrive/e/Work/Dev/StackOverflow/q055271912/code00.py'
[prompt]>
[prompt]> cat code01.py
#!/usr/bin/env python3

print("This is:", __file__)

[prompt]> python3 -c "import os, subprocess;subprocess.Popen(os.path.join(os.getcwd(), \"code01.py\")).communicate()"
This is: /cygdrive/e/Work/Dev/StackOverflow/q055271912/code01.py

Une autre façon serait d'exécuter l'interpréteur suivi du nom du fichier, mais je ne sais pas comment le faire depuis Flask - en fait, cela nécessiterait de patcher Werkzeug (_reloader.py  :_get_args_for_reloading ), mais ce serait juste une solution de contournement boiteuse (gainarie ) - voir ci-dessous.


Mise à jour #0

En regardant la réponse de @AxelGrytt, il s'avère que c'est un problème connu :[GitHub] :pallets/werkzeug - 0.15.0 causes OSError :[Errno 8] Exec format error :in Docker for Windows (hmm, soumis le même jour que celui-ci question (et 2 jours après la sortie) :) ).

Donc, ce que j'ai dit ci-dessus est correct, mais il convient de mentionner qu'il existe un autre moyen de le réparer :supprimer le exec autorisation pour le fichier :

chmod -x api/manage.py

Selon Werkzeug auteurs, à partir de maintenant, c'est le comportement souhaité (s'applique également à v0.15.2 ):

  • Un fichier avec exec ensemble d'autorisations, devrait ont aussi un shebang
  • Un fichier sans un shebang , ne devrait pas avoir le exec ensemble d'autorisations

Il s'agit d'un nouveau comportement dans Werkzeug 0.15. La rétrogradation vers Werkzeug 0.14.1 peut fonctionner, mais la version 0.14 n'est plus prise en charge, vous feriez donc mieux de corriger le problème avec votre fichier comme décrit dans les autres réponses.


Si vous désactivez le mode débogage (ne passez pas debug=True ou définissez FLASK_DEBUG=0 ), le rechargeur ne sera pas utilisé et donc ce problème ne se produira pas. Le compromis est que vous n'avez plus le rechargeur.

if __name__ == "__main__":
    connexion_app.run(host="0.0.0.0", port=constants.API_PORT, debug=True)

Il est préférable de résoudre ce problème en s'assurant que les fichiers marqués comme exécutables ont une ligne d'interpréteur, comme #!/usr/bin/env python3 (de https://stackoverflow.com/a/55272071).