python फ्लास्क CLI 'OSError:[Errno 8] Exec format एरर' को डॉकटर-कंपोज़ के माध्यम से चलाने पर फेंकता है




windows docker (4)

@CristiFati के जवाब ने मेरे लिए 1 अतिरिक्त कदम के साथ काम किया:

मुझे EOL को \r\n से \n तक सही करना था।

क्षमा करें, मेरे पास टिप्पणी जोड़ने और नया उत्तर खोलने के लिए पर्याप्त अंक नहीं हैं ...

मैं एक कस्टम स्क्रिप्ट के साथ फ्लास्क एप्लिकेशन चला रहा हूं। या वैसे भी करने की कोशिश कर रहा है।

मैं विंडोज 10 पर हूं और एप्लिकेशन को कमांड के साथ लिनक्स डॉकटर कंटेनर में चलना चाहिए:

docker-compose up api

डॉकर-रचना version 1.23.2 । Dockerfile में, api सेवा कमांड के माध्यम से चलती है:

command: python manage.py run --host "0.0.0.0" --with-threads

जैसा कि यह शुरू करने की कोशिश करता है, मैं अपवाद देखता हूं

OSError: [Errno 8] Exec format error: '/api/manage.py'

मैंने शुरू में सोचा था कि यह खतरनाक विंडोज लाइन एंडिंग्स होगा, मेरे लिए एक बार फिर से आओ, लेकिन मेरे सभी स्रोत फ़ाइलों पर dos2unix चलाने से समस्या हल नहीं हुई है।

मैं इस त्रुटि से कैसे बच सकता हूं?

manage.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()

पूर्ण ट्रेसबैक

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'

ऐसा लगता है कि आपके api / manage.py में shebang ( [Wikipedia]: Shebang (Unix) ) नहीं है, इसलिए डिफ़ॉल्ट (करंट) कमांड प्रोसेसर (एक शेल - आमतौर पर बैश ) इसे चलाने का प्रयास कर रहा है, जो (जाहिर है) विफल रहता है।

समस्या को ठीक करने के लिए, एक शेबंग जोड़ें (फ़ाइल की शुरुआत में, यह सुनिश्चित करते हुए कि आपका संपादक निक्स स्टाइल लाइन को समाप्त करता है ( \ n , 0x0A , LF )):

  • डिफ़ॉल्ट पायथन स्थापना:

    #!/usr/bin/env python
    • भिन्न (स्पष्ट रूप से पायथन 3 निर्दिष्ट करें):

      #!/usr/bin/env python3
  • कस्टम पायथन स्थापना:

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

ध्यान दें कि आपको फ़ाइल ( chmod +x api/manage.py ) पर निष्पादन अनुमति की आवश्यकता है।

उदाहरण:

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

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

[prompt]> python3 -c "import os, subprocess;subprocess.Popen(os.path.join(os.getcwd(), \"code0.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//q055271912/code0.py'
[prompt]>
[prompt]> cat code1.py
#!/usr/bin/env python3

print("This is:", __file__)

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


एक अन्य तरीका फ़ाइल नाम के बाद दुभाषिया को चलाना होगा, लेकिन मुझे नहीं पता कि इसे फ्लास्क से कैसे करना है - वास्तव में पैचिंग Werkzeug ( _reloader.py : _get_args_for_reloading ) की आवश्यकता होगी, लेकिन यह सिर्फ एक लंगड़ा वर्कअराउंड होगा ( गेनरी ) - नीचे देखें।

@ EDIT0 :

@ AxelGrytt के उत्तर को देखते हुए, यह पता चला है कि यह एक ज्ञात मुद्दा है: [GitHub]: pallets / werkzeug - 0.15.0 OSError का कारण बनता है: [Errno 8] Exec प्रारूप त्रुटि: विंडोज के लिए डॉकर में (hmm), एक ही दिन में इसे प्रस्तुत किया जाता है। सवाल (और रिलीज के 2 दिन बाद :))।

इसलिए, मैंने जो ऊपर बताया है वह सही है, लेकिन यह ध्यान देने योग्य है कि इसे ठीक करने का एक और तरीका है: फ़ाइल के लिए निष्पादन की अनुमति को हटाना:

chmod -x api/manage.py

वेर्केगयुग के लेखकों के अनुसार, अब से, यह वांछित व्यवहार है ( v 0.15.2 पर भी लागू होता है):

  • निष्पादन की अनुमति सेट के साथ एक फ़ाइल में एक शबंग भी होना चाहिए
  • शेबंग के बिना एक फ़ाइल, निष्पादन की अनुमति सेट नहीं होनी चाहिए

यह Werkzeug 0.15 में एक नया व्यवहार है। Werkzeug 0.14.1 में अपग्रेड करने से काम चल सकता है, लेकिन 0.14 अब समर्थित नहीं है, इसलिए आप अपनी फ़ाइल के साथ समस्या को सुधारना बेहतर समझेंगे क्योंकि अन्य उत्तरों में वर्णित है।


यदि आप डिबग मोड को अक्षम करते हैं (डीबग पास न करें debug=True या FLASK_DEBUG=0 सेट करें), पुनः FLASK_DEBUG=0 उपयोग नहीं किया जाएगा और इसलिए यह समस्या नहीं होगी। ट्रेडऑफ़ यह है कि अब आपके पास पुनः लोडर नहीं है।

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

निष्पादन योग्य के रूप में चिह्नित फ़ाइलों की व्याख्या सुनिश्चित करके इसे ठीक करना बेहतर होता है, जैसे कि #!/usr/bin/env python3 ( share )।





docker-compose