लिनक्स में पायथन को लाइन की आवश्यकता क्यों है #? / Usr / bin / python?


50

बहुत आसान सवाल: लिनक्स में, पायथन को लाइन की आवश्यकता क्यों होती है

#!/usr/bin/python

एक अजगर फ़ाइल की शुरुआत में, क्योंकि विंडोज नहीं करता है?

यह क्या करता है? "वर्णन का कारण" पायथन के लिंक "थोड़ा अस्पष्ट है ...


28
नीचे दिए गए उत्तर सभी सही हैं, उनमें से कोई भी पता नहीं है कि विंडोज को इस लाइन की आवश्यकता क्यों नहीं है। विंडोज .किस तरह की फाइल है, यह निर्धारित करने के लिए फाइल के विस्तार (उसके बाद वाला हिस्सा ) पर निर्भर करता है। यहां तक ​​कि विंडोज इससे दूर जा रहा है: Microsoft Word फ़ाइल की पहली कुछ पंक्तियों की जाँच करें, और यह बताएगा कि यह वास्तव में, Microsoft Word फ़ाइल है।
चार्ल्स ग्रीन

9
कमरे में हाथी यह है कि जब तक आप अजगर 2 और 3 के साथ संगत नहीं हो जाते तब तक / usr / bin / python का उपयोग नहीं करना चाहिए: आर्क: इसे python3 के लिए सहानुभूति देता है, एक चाल जो PSF द्वारा स्वीकार की जाती है, जो खुद इसके खिलाफ सलाह देते हैं।
फिर भी

5
यह निहित है, लेकिन नीचे दिए गए उत्तरों में स्पष्ट रूप से नहीं बताया गया है कि इसकी आवश्यकता नहीं है । यदि आप स्क्रिप्ट को केवल ts के नाम से निष्पादित करना चाहते हैं तो यह आवश्यक है। आप हमेशा के python myscript.pyबजाय चला सकते हैं ।
क्रिस एच

3
@CharlesGreen हमें यह जानने के लिए नहीं लगता है कि खिड़कियां क्यों नहीं ;-) यह तो एसओ तक है।
रिनविंड

2
@YetAnotherUser Python 3 को रिलीज़ हुए छह साल और ग्यारह महीने हो चुके हैं, इस समय मुझे लगता है कि लोग डिफ़ॉल्ट 3 से बेहतर होंगे और आवश्यक होने पर 2 के उपयोग को स्पष्ट रूप से निर्दिष्ट करेंगे।
JAB

जवाबों:


58

लिनक्स पर पायथन की ऐसी कोई विशेष आवश्यकता नहीं है। यह यूनिक्स / लिनक्स पर प्रोग्राम लोडर है जो "शेबंग" लाइन का उपयोग करता है, जैसा कि इसे कहा जाता है। यह वास्तव में एक सीमा के बजाय एक विशेषता है, लेकिन हम एक पल में मिल जाएगा। "शीबंग" पर विकी पेज में अधिक विवरण हैं, लेकिन मैं यहां विंडोज की तुलना में एक सिंहावलोकन देने की कोशिश करूंगा।

सबसे पहले, आइए विंडोज पर स्थिति देखें:

  • जब आप किसी फ़ाइल को खोलने या चलाने का प्रयास करते हैं, तो विंडोज़ पहले उस फ़ाइल के विस्तार की जाँच करता है । यह फ़ाइल नाम का अंतिम भाग है, जिसकी शुरुआत .पायथन फ़ाइलों के मामले में होती है, यह आमतौर पर होता है .py
  • Windows देखता है कि फ़ाइल एक्सटेंशन के आधार पर क्या कार्रवाई की जानी चाहिए।
    • यह जानकारी विंडोज रजिस्ट्री में दर्ज की गई है; जब पायथन स्थापित होता है, तो यह आमतौर पर विंडोज को बताता है कि .pyनई स्थापित एप्लिकेशन पायथन (यानी पायथन इंटरप्रेटर) का उपयोग करके फाइलें खोली जानी चाहिए ।
    • कई फ़ाइल-प्रकारों में अंतर्निहित व्यवहार होते हैं; उदाहरण के लिए, निष्पादन योग्य फाइलें (जैसे कि पायथन इंटरप्रेटर खुद) को समाप्त होना चाहिए .exe, और .batफ़ाइलों को विंडोज बैच-स्क्रिप्ट के रूप में निष्पादित किया जाता है।
    • किसी विशेष फ़ाइल-प्रकार के लिए की गई कार्रवाई अनुकूलन योग्य है । उदाहरण के लिए, आप विंडोज को बता सकते हैं कि .pyफ़ाइलों का उपयोग करने के बजाय python.exe, इसे उन्हें किसी अन्य प्रोग्राम के साथ खोलना चाहिए, जैसे कि टेक्स्ट एडिटर notepad.exe
      • इस मामले में, पायथन स्क्रिप्ट को चलाने के लिए , आपको मैन्युअल रूप से कॉल करना होगा python <scriptname>.py(या आपके .batलिए ऐसा करने के लिए एक फ़ाइल लिखना होगा )।

अब, यदि पायथन लिपि के शीर्ष पर एक शबंग रेखा ( #!/usr/bin/pythonया #!/usr/bin/env python) हो तो क्या होगा ? खैर, चूंकि #पायथन में एक टिप्पणी लाइन है, पायथन दुभाषिया इसे अनदेखा करता है। यह एक कारण है कि यूनिक्स / लिनक्स दुनिया में उपयोग की #जाने वाली अधिकांश स्क्रिप्टिंग भाषाएं टिप्पणी लाइनें शुरू करने के लिए उपयोग करती हैं।

इसलिए यह कहना थोड़ा भ्रामक है कि विंडोज को " #!लाइन " की आवश्यकता नहीं है ; विंडोज लाइन नहीं देखता है #!, और वास्तव में यह बताने के लिए फ़ाइल-एक्सटेंशन पर निर्भर करता है कि उसे क्या करना है। इसके कुछ नुकसान हैं:

  • आप अंत में पायथन लिपियों का नाम अवश्य दें.py , ताकि उन्हें अपने आप इस तरह पहचाना जा सके।
  • Python3 स्क्रिप्ट से Python2 स्क्रिप्ट को अलग करने का कोई आसान तरीका नहीं है।
  • जैसा कि पहले उल्लेख किया गया है, यदि आप .pyफ़ाइल-प्रकार के लिए डिफ़ॉल्ट लॉन्च व्यवहार को बदलते हैं, तो विंडोज अब उन स्क्रिप्ट को पायथन के साथ स्वचालित रूप से नहीं चलाएगा। ध्यान दें कि यह अनायास किया जा सकता है।

अब, आइए देखें कि यूनिक्स / लिनक्स कैसे स्क्रिप्ट लॉन्च करता है:

ध्यान देने वाली पहली बात यह है कि विंडोज के विपरीत, यूनिक्स / लिनक्स, किसी विशेष कार्यक्रम का उपयोग करके पायथन लिपियों को "खोलने" की कोशिश नहीं कर रहा है, कम से कम वैचारिक रूप से; ओएस जानता है कि स्क्रिप्ट कुछ ऐसा है जिसे "निष्पादित बिट" नामक कुछ के कारण निष्पादित किया जा सकता है (जो इस उत्तर के दायरे से बाहर है)। इसलिए, यदि आप गलती से टाइप #!/usr/bin/pthonकरते हैं #!/usr/bin/python, तो आपको एक त्रुटि संदेश मिलेगा जिसमें यह पाठ शामिल है:

/usr/bin/pthon: bad interpreter: No such file or directory.

शब्द "दुभाषिया" हमें शेबंग रेखा की भूमिका के बारे में एक सुराग देता है (हालांकि तकनीकी रूप से निर्दिष्ट कार्यक्रम एक दुभाषिया के अलावा कुछ और हो सकता है, जैसे कि catया एक पाठ संपादक)। जब आप किसी फ़ाइल को निष्पादित करने का प्रयास करते हैं, तो यहां क्या होता है:

  • यूनिक्स / लिनक्स प्रोग्राम लोडर उस फ़ाइल के पहले दो बाइट्स को देखता है; यदि ये दो बाइट्स हैं #!, तो लोडर शेष शेब लाइन (शेबंग को छोड़कर) को एक दुभाषिया लॉन्च करने के लिए एक कमांड के रूप में व्याख्या करता है जिसके साथ फाइल सामग्री को स्क्रिप्ट के रूप में चलाना है।
  • प्रोग्राम लोडर निर्दिष्ट दुभाषिया को लॉन्च करता है, इसे एक तर्क के रूप में मूल फ़ाइल का पथ खिलाता है ।

इसके कुछ फायदे हैं:

  • स्क्रिप्ट-लेखक का अधिक नियंत्रण होता है, जिसमें दुभाषिया का उपयोग किया जाएगा (जो पायथन 2 / पायथन 3 मुद्दे को हल करता है) और कभी-कभी दुभाषिया के लिए एक अतिरिक्त तर्क पारित कर सकता है (विवरण के लिए विकी पृष्ठ देखें)।
  • स्क्रिप्ट के फ़ाइल नाम को अनदेखा कर दिया जाता है , इसलिए आप पाइथन स्क्रिप्ट का नाम दे सकते हैं जो आप चाहते हैं।

ध्यान दें, अंत में, कि यूनिक्स / लिनक्स को पायथन स्क्रिप्ट को चलाने के लिए शेबंग लाइन की आवश्यकता नहीं है । याद है कि सभी शेबंग लाइन वास्तव में प्रोग्राम लोडर को एक दुभाषिया का चयन करने की अनुमति देती है । लेकिन विंडोज की तरह, यह मैन्युअल रूप से किया जा सकता है:

python <myscript>

1
विंडोज पर आप आसानी से .py2और .py3पायथन 2 / पायथन 3 स्क्रिप्ट के लिए एक्सटेंशन कर सकते हैं । इसलिए लिनक्स (+ x बिट) और विंडोज (फाइल एक्सटेंशन) दोनों को फाइल सिस्टम में मेटाडेटा की आवश्यकता होती है। मुख्य अंतर यह है कि पारगमन में + x बिट अधिक आसानी से खो जाता है। यह जरूरी नहीं कि एक नकारात्मक पहलू है।
MSLters

1
@MSalters निष्पादित बिट में भी बहुत कम जानकारी संलग्न है। और ध्यान दें कि आपके पास दिए गए सिस्टम पर कई Python2 दुभाषिए हो सकते हैं (मेरी पिछली नौकरी में रूबी और अन्य भाषाओं के साथ भी ऐसी ही स्थिति थी); शेबंग लाइन के माध्यम से इसके साथ काम करना लगभग तुच्छ है, जबकि विंडोज पर स्थिति काफी कम ट्रैक्टेबल हो जाती है जितना अधिक आप कई समान फ़ाइल-प्रकारों को प्रबंधित करने का प्रयास करते हैं।
काइल स्ट्रैंड

इसके अलावा, क्या विस्तार वास्तव में "मेटाडेटा" के रूप में गिना जाता है? यह सिर्फ नाम का हिस्सा है।
काइल स्ट्रैंड

1
किसी फ़ाइल के मेटाडेटा में पूरा फ़ाइल नाम, निर्माण समय, एक्सेस बिट्स आदि शामिल हैं, केवल सामग्री ही मेटाडेटा के बजाय डेटा है। "कई दुभाषियों" के रूप में, यह वास्तव में एक वास्तविक समस्या है और वास्तव में यह शेबंग लाइन में क्यों नहीं होना चाहिए । अगर आपके पास है /usr/bin/i686/pythonऔर /usr/bin/amd64/pythonक्या है? पूरी तरह से उचित है, लेकिन यह उन अजगर लिपियों को तोड़ता है जिन पर एक हार्डकोड की धारणा है /usr/bin/python। दुभाषिया की पसंद स्क्रिप्ट लेखक की पसंद नहीं है, लेकिन स्क्रिप्ट उपयोगकर्ता की है, स्क्रिप्ट लेखक को केवल भाषा (डायलॉग) चुनने के लिए मिलती है।
17

1
@MSalters, यह वही है /usr/bin/env, जो एनव-सेटअप स्क्रिप्ट के साथ है। इसका विंडोज संस्करण क्या है? किसी regeditस्क्रिप्ट को चलाने से पहले एक स्क्रिप्ट चलाना सही .pyहै ताकि आप यह सुनिश्चित कर सकें कि आपको जो दुभाषिया मिल रहा है?
काइल स्ट्रैंड

41

आपके द्वारा इंगित की गई लाइन का उपयोग कंप्यूटर को यह बताने के लिए किया जाता है कि फ़ाइल / स्क्रिप्ट को सीधे चलाने के लिए कौन से प्रोग्राम / दुभाषिया का उपयोग करना है, और कोई भी तर्क जो उस प्रोग्राम को पास करना चाहिए जब स्क्रिप्ट चलती है। हालाँकि, यह पायथन की आवश्यकता नहीं है , यह लिनक्स कर्नेल / सिस्टम की आवश्यकता है यदि आप स्क्रिप्ट को सीधे चलाने का इरादा रखते हैं (और इसे सिंटैक्स द्वारा पायथन को पास नहीं करते हैं)।

यदि आप निष्पादित python script.pyया समान करने जा रहे हैं तो इसकी आवश्यकता नहीं है । यह केवल तभी आवश्यक है जब आप स्क्रिप्ट (फ़ाइल) को सीधे चलाने का इरादा रखते हैं, बिना दुभाषिए को उपयोग करने के लिए (जैसे कि python) प्रदान किए बिना ।


बैश स्क्रिप्ट के लिए, यह कुछ इस तरह होगा:

#!/bin/bash [optional Bash arguments]
# Bash script code here
...
exit 0;

यह सिस्टम को इंगित करेगा कि, जब यह चलता है, तो इसे चलाया जाना चाहिए /bin/bashजिसके माध्यम से सिस्टम पर शेल / शेल-स्क्रिप्ट भाषाओं में से एक है।


हालाँकि, पायथन कोड के लिए, यहाँ, आप निष्पादन योग्य फ़ाइल को पायथन के माध्यम से चलाना चाहते हैं, इसलिए आप इसे बताएं कि आप इसमें कौन सा दुभाषिया चलाने का इरादा रखते हैं।

#!/usr/bin/python [optional Python arguments]
# Python code here
...
exit()

यह, जैसे बैश के लिए, इंगित करता है कि /usr/bin/pythonइसका उपयोग किया जाना चाहिए (यह आपके व्यक्तिगत सिस्टम कॉन्फ़िगरेशन के आधार पर पायथन 2 या पायथन 3 है)।


इस तरह, आप चला सकते हैं ./filename.pyया ./executableया ./scripttorunसीधे।

शुरुआत में उस लाइन के बिना, और यह मानकर कि आपने फ़ाइल / स्क्रिप्ट को निष्पादन योग्य बनाया है, और यह मानकर कि आप पायथन स्क्रिप्ट के साथ काम कर रहे हैं, python filename.pyयदि आपके पास #!/usr/bin/pythonलाइन नहीं थी, तो आपको दौड़ना होगा । (बैश स्क्रिप्ट के लिए, आपको bash script.shअन्य लिपियों / भाषाओं, जैसे पर्ल, रूबी इत्यादि के लिए , या ऐसा ही करना होगा )

सिंटैक्स को ऊपर हाइलाइट करना प्रत्येक अनुभाग में भाषा-विशिष्ट है, हालांकि यह वास्तव में मायने नहीं रखता है।


1
जोड़ने के लिए एक दिलचस्प बात यह होगी कि यह मामला खुद के बाद अतिरिक्त पैरामीटर निर्दिष्ट करने के लिए संभव है, उसी तरह से अधिकांश मामलों में, जैसे कि दुभाषिया (सीधे बुलाया गया था #!/bin/bash -x, #!/usr/bin/perl -lan, आदि)।
कोस

7
@ कोस: मुझे लगता है कि आप एक अतिरिक्त तर्क को निर्दिष्ट कर सकते हैं, जो एक पीआईटीए रहा है जब एक ( /usr/bin/env pythonसही ) को सही अजगर प्राप्त करने के लिए उपयोग करना चाहिए ।
unperson325680

@progo यकीन नहीं है कि समस्या क्या envहै, लेकिन समस्या तर्कों की संख्या नहीं है: #!/usr/bin/perl -l -a -nतीन तर्क हैं लेकिन यह काम करता है। हालांकि फिर से, मैं सटीक समस्या को हल करने में सक्षम नहीं हूं।
कोस

जब स्पष्ट रूप से स्क्रिप्ट के साथ दुभाषिया को तर्क के रूप में कहा जाता है, तो बाद की शुरुआत के साथ होने का कोई कारण नहीं है ./। दूसरे शब्दों में, बस python filename.pyया bash script.shठीक काम करेगा। शामिल करने का एकमात्र कारण ./एक कमांड नाम है, जब आप शेल को खोजने के लिए नहीं कहना चाहते हैं $PATH(जो शायद वर्तमान निर्देशिका में फ़ाइलों को नहीं खोजेंगे), लेकिन आपके द्वारा निर्दिष्ट पथ को ले जाएं-जैसा है। लेकिन यह कमांड तर्कों पर लागू नहीं होता है।
मार्क वैन लीउवेन

@kos: समस्या यह हो सकती है कि envकर्नेल से बाकी तर्क कैसे प्राप्त किए जाएं। उन सभी को एक बड़े तर्क के रूप में माना जा सकता है जिसमें कोई भी विभाजन नहीं होता है। आर्टिक्यूलेशन के लिए क्षमा करें, मुझे इस बारे में अब और अच्छी तरह से याद नहीं है
unperson325680

16

रेखा:

#!/usr/bin/python

को 'शबंग' कहा जाता है और यह दुभाषिया बाइनरी के लिए पथ को इंगित करता है जिसका उपयोग फ़ाइल में बाकी कमांडों की व्याख्या करने के लिए किया जाएगा। यह आमतौर पर एक स्क्रिप्ट की पहली पंक्ति है।

तो लाइन #!/usr/bin/pythonइंगित करती है कि फ़ाइल की सामग्री की व्याख्या pythonद्विआधारी द्वारा स्थित पर की जाएगी /usr/bin/python

नोट करें कि कर्बेज द्वारा शेबंग लाइन को पार्स किया गया है और फिर स्क्रिप्ट को अंततः एक तर्क के रूप में कहा जाएगा:

python script_name

इसी तरह के मामले में #!/bin/bash:

bash script_name

2
मुझे नहीं लगता कि मैंने कभी एक हाइफ़न देखा है shebang। के बाद से शब्द "हैश" और "बैंग," से बनता है अपनी वर्तनी नहीं बहुत स्पष्ट है, के बाद से यह लग रहा है यह का एक संयोजन है की तरह है "उसने" और "बैंग"।
काइल स्ट्रैंड

आप इसे hashbang( #= "हैश") या shebang( #= "तेज") कह सकते हैं, यह इस बात पर निर्भर करता है कि आप #चरित्र का नाम कैसे देते हैं । हालाँकि, shebangवास्तव में अधिक सामान्य है। @KyleStrand
बाइट कमांडर

7

तकनीकी रूप से, इसकी आवश्यकता नहीं है। इसमें उस वातावरण के लिए एक पथ की आवश्यकता होती है जहाँ आपकी स्क्रिप्ट निष्पादित होती है। आपकी भविष्य की लिपियों में / usr / bin / env को शामिल करना बेहतर होगा, फिर अजगर को निर्दिष्ट करें। यह इस बात को स्वीकार करता है कि आपकी स्क्रिप्ट अजगर के वातावरण में चलती है, जहां कोई भी अजगर स्थापित नहीं है। आप संगतता कारणों से ऐसा करना चाहते हैं, आप सुनिश्चित नहीं कर सकते कि जिस व्यक्ति के साथ आप अपना कोड साझा करते हैं, उसके पास usr / bin / python में अजगर स्थापित होगा, या उनके पास उन सिस्टम फ़ाइलों की अनुमति होगी।

यहां स्टैक ओवरफ्लो से एक समान प्रश्नोत्तर है

आपकी स्क्रिप्ट में जो दिखता है वह है:

#!/usr/bin/env python

Python3 को कैसे निर्दिष्ट किया जाए, इसके लिए मैं कुछ चिंता भी देखता हूं। यहां है कि इसे कैसे करना है:

#!/usr/bin/env python3

5

Linux में, Python को #!(Shebang) लाइन की आवश्यकता हो सकती है या नहीं भी हो सकती है । यह इस बात पर निर्भर करता है कि पायथन कोड को कैसे संभाला जाता है, या तो पायथन इंटरएक्टिव मोड में कोड चला रहा है या पायथन स्क्रिप्ट में।

पाइथन इंटरएक्टिव मोड उपयोगकर्ता को सीधे पाइथन कोड टाइप करने और चलाने की अनुमति देता है, जिसे शेबंग लाइन की आवश्यकता नहीं होती है। इंटरेक्टिव मोड चलाने के लिए, एक टर्मिनल खोलें और pythonPython 2.X के लिए या python3Python 3.X के लिए टाइप करें।

$  python
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

$  python3
Python 3.4.3 (default, Oct 14 2015, 20:33:09) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

पायथन स्क्रिप्ट उपयोगकर्ता को एक सादे पाठ फ़ाइल में पायथन कोड लिखने और सहेजने की अनुमति देती है, फिर बाद में कोड चलाएं। इसके लिए शेबग लाइन की आवश्यकता हो सकती है या नहीं। हालांकि, दो ज्ञात कारण हैं जब लिनक्स में पायथन लिपि का उपयोग करने के लिए शेलबैंग लाइन की आवश्यकता होती है।

  1. एक निष्पादन योग्य स्क्रिप्ट में पायथन कोड चलाने के लिए यानी यह परिभाषित करता है कि कोड को कैसे चलाया जाना चाहिए और किस दुभाषिया का उपयोग करना चाहिए;

  2. पायथन कोड को पायथन के विशिष्ट संस्करण के संबंध में चलाने के लिए अर्थात ऐसे कोड चलाएं जो पायथन 2.X या पायथन 3.X के साथ संगत हों

पायथन लिपियों के साथ अभ्यास करें

नीचे फाइलों की सूची और सामग्री दी गई है, जिनका उपयोग मैंने ऐसे मामलों को दिखाने के लिए किया है, जो #!(शेबंग) लाइन आवश्यक है या आवश्यक नहीं है।

$  ls -ln *.py
-rw-rw-r-- 1 1000 1000  94 Dec 14 18:37 hello1.py
-rwxrwxr-x 1 1000 1000 116 Dec 14 18:37 hello2e.py
-rw-rw-r-- 1 1000 1000 116 Dec 14 18:37 hello2.py
-rwxrwxr-x 1 1000 1000 117 Dec 14 18:37 hello3e.py
-rwxrwxr-x 1 1000 1000 120 Dec 14 18:37 hello3m.py
-rw-rw-r-- 1 1000 1000 117 Dec 14 18:37 hello3.py

$  file *.py
hello1.py:  ASCII text
hello2e.py: Python script, ASCII text executable
hello2.py:  Python script, ASCII text executable
hello3e.py: Python script, ASCII text executable
hello3m.py: Python script, UTF-8 Unicode (with BOM) text executable
hello3.py:  Python script, ASCII text executable
  • hello1.py केवल स्रोत कोड होता है।

    import sys
    sys.stdout.write("Hello from Python %s\n" % (sys.version,))
    print("Hello, World!")
  • hello2.py इसमें सोर्स कोड और शेबबैंग लाइन शामिल है।

    #!/usr/bin/env python
    import sys
    sys.stdout.write("Hello from Python %s\n" % (sys.version,))
    print("Hello, World!")
  • hello2e.pyके रूप में ही होता है hello2.pyऔर निष्पादन योग्य बनाया जाता है।

  • hello3.pyइसमें समान है hello2.py, सिवाय इसके कि पहली पंक्ति का नाम बदलकर पायथन 3 के साथ चलने के लिए अनुकूलित किया गया है #!/usr/bin/env python3

  • hello3e.pyके रूप में ही होता है hello3.pyऔर निष्पादन योग्य बनाया जाता है।

  • hello3m.pyके रूप में ही होता है hello3.pyऔर निष्पादन योग्य बनाया है, के साथ सहेजा छोड़कर Write Unicode BOMपाठ संपादक यानी Mousepad में विकल्प।

इस बिंदु से परे, उपयोगकर्ता पायथन लिपियों को चलाने के लिए दो तरीकों के साथ प्रस्तुत किया जाएगा। दोनों विधियों का प्रदर्शन नीचे दिया गया है।

विधि 1: पायथन प्रोग्राम के साथ चलाएँ

पायथन 2 और पायथन 3 के साथ स्रोत कोड चलाते समय कमांड और आउटपुट नीचे दिए गए हैं।

$  python hello1.py
Hello from Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2]
Hello, World!

$  python3 hello1.py
Hello from Python 3.4.3 (default, Oct 14 2015, 20:33:09) 
[GCC 4.8.4]
Hello, World!

पायथन के दोनों संस्करण स्क्रिप्ट को सफलतापूर्वक चलाने में सक्षम थे। इसलिए, पायथन स्क्रिप्ट को कमांड या कमांड के माध्यम से चलाने के दौरान शेलंग लाइन की आवश्यकता नहीं होती है ।pythonpython3

विधि 2: पायथन स्क्रिप्ट के रूप में चलाएँ

नीचे दिए गए आदेश और आउटपुट हेबंग लाइन के साथ स्रोत कोड चलाते हैं, जो न तो अनुकूल हैं, नॉन-निष्पादन योग्य और निष्पादन योग्य मामलों सहित पायथन 2 और पायथन 3।

$  ./hello1.py
bash: ./hello1.py: Permission denied

$  ./hello2.py
bash: ./hello2.py: Permission denied

$  ./hello3.py
bash: ./hello3.py: Permission denied

$  ./hello2e.py 
Hello from Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2]
Hello, World!

$  ./hello3e.py 
Hello from Python 3.4.3 (default, Oct 14 2015, 20:33:09) 
[GCC 4.8.4]
Hello, World!

पहले तीन स्क्रिप्ट विफल हो गए हैं क्योंकि ये स्क्रिप्ट गैर-निष्पादन योग्य हैं, भले ही शेबंग लाइन होने या न होने के लिए (समर्थन प्रमाण के लिए, नीचे अतिरिक्त उदाहरण देखें)। अंतिम दो लिपियों में शेबंग लाइन है और यह निष्पादन योग्य हैं।

जाहिर है, एक स्क्रिप्ट जिसे निष्पादन योग्य बनाया गया है वह अनिवार्य रूप से शेबंग लाइन के बिना बेकार है। इसलिए, जब एक निष्पादन योग्य स्क्रिप्ट में पायथन कोड्स को चलाया जाता है, तो शेबबंग लाइन की आवश्यकता होती है और स्क्रिप्ट को निष्पादन योग्य होना चाहिए।

जब शेबंग काम नहीं करता है

मेरे तैयार और परीक्षण किए गए उदाहरण में, hello3m.pyएक निष्पादन योग्य स्क्रिप्ट के रूप में चल रहा है, विफल हो गया है और एक त्रुटि लौटा दी है।

$  ./hello3m.py 
./hello3m.py: line 1: #!/usr/bin/env: No such file or directory

यह एक ज्ञात सीमा है कि शेबंग काम नहीं करता है या अमान्य हो जाता है। जब एक फाइल को यूनिकोड BOM (बाइट ऑर्डर मार्क) के रूप में सहेजा जाता है, तो यह एक निष्पादन योग्य पायथन स्क्रिप्ट के रूप में सामान्य रूप से चलने में विफल हो जाएगा।

अतिरिक्त उदाहरण

इस अतिरिक्त उदाहरण को केवल सहायक प्रमाण के रूप में माना जाएगा। उपयोगकर्ता को इस उदाहरण को चलाने से बचना चाहिए, हालांकि परिणाम हानिरहित है।

मैंने एक और फाइल बनाई है hello1e.pyजिसका नाम है , जिसमें समान hello1.pyऔर निष्पादन योग्य बनाया गया है। इस स्क्रिप्ट को चलाने से वाक्य रचना त्रुटि हुई।

$  ./hello1e.py 
./hello1e.py: line 2: syntax error near unexpected token `"Hello from Python %s\n"'
./hello1e.py: line 2: `sys.stdout.write("Hello from Python %s\n" % (sys.version,))'

इस स्क्रिप्ट को चलाते समय, सबसे पहले, माउस कर्सर को प्लस-साइन में बदल दिया जाएगा और दिखने में कुछ भी नहीं होगा। जब तक मैंने डेस्कटॉप या टर्मिनल विंडो पर क्लिक नहीं किया तब तक सिंटैक्स त्रुटि नहीं दिखाई जाएगी। फिर, यह स्क्रिप्ट स्क्रिप्ट sysके समान निर्देशिका में एक फ़ाइल बनाएगी ।

$  file sys
sys: PostScript document text conforming DSC level 3.0, Level 1

sysफ़ाइल, पोस्टस्क्रिप्ट फ़ाइल के रूप में पहचान की गई है फाइल एक्सटेंशन के बिना। इस फाइल को डॉक्यूमेंट व्यूअर यानी इविसन में खोला जा सकता है, और फाइल में वास्तव में उस विंडो का स्क्रीनशॉट होता है, जिसे मैंने पहले क्लिक किया था। मेरे अनुभव में, फ़ाइल कुछ मेगाबाइट जितनी बड़ी हो सकती है।

एक बार फिर, शेबंग लाइन की आवश्यकता है और पायथन स्क्रिप्ट को एक निष्पादन योग्य स्क्रिप्ट के रूप में चलाने पर स्क्रिप्ट को निष्पादन योग्य होना चाहिए। अन्यथा, स्क्रिप्ट ऊपर बताए अनुसार गलत व्यवहार करेगी।

अतिरिक्त नोट्स

शब्द "निष्पादन योग्य" या "निष्पादन योग्य होना चाहिए" स्क्रिप्ट को चलाने की अनुमति को संदर्भित करता है। यह chmod +x FILENAMEटर्मिनल में कमांड चलाकर , या फ़ाइल प्रबंधक के भीतर "इस फाइल को प्रोग्राम के रूप में चलाने की अनुमति दें" या गुण विंडो में कुछ समान की जाँच करके किया जाता है ।

जबकि अन्य मौजूदा जवाबों में लगभग सब कुछ शामिल था, इस उत्तर ने मामले को समझाने के लिए व्यावहारिक उदाहरणों का उपयोग करके अलग दृष्टिकोण लिया है। कोड सिंटैक्स को देखभाल के साथ लिखा गया है, जैसे कि उदाहरण पायथन 2 या पायथन 3 के साथ चलाया जा सकता है, जैसा कि यह है।

पायथन कोड को विंडोज पर पायथन का उपयोग करने और यूनिक्स प्लेटफार्मों पर पायथन का उपयोग करने से अनुकूलित किया गया है, सर्वव्यापी "हैलो, वर्ल्ड!" के अतिरिक्त एक-लाइन कोड के साथ। कार्यक्रम।

सभी कोड और कमांड पूरी तरह से परीक्षण किए गए हैं और Xubuntu 14.04 सिस्टम में काम करता है, जिसमें डिफ़ॉल्ट रूप से पायथन 2.7 और पायथन 3.4 स्थापित थे।


4

इसका मतलब यह है कि जब उस फ़ाइल को निष्पादित किया जाता है, तो आपका कंप्यूटर प्रोग्राम के साथ इसे निष्पादित करना जानता है /usr/bin/python, तो आप इसे किसी अन्य भाषा से अलग कैसे बता सकते हैं, जैसे बैश जहां आप करेंगे #!/bin/bash। यह इतना है कि आप बस चला सकते हैं:

./[file-to-execute]

और यह पता चलेगा कि आपको किस फ़ाइल के साथ इसे निष्पादित करना है, बजाय इसके कि आप अपने आप को किसी चीज़ के साथ निर्दिष्ट करें:

python ./[file-to-execute].py

इस #!हिस्से को आमतौर पर शबंग या क्रंच बैंग के रूप में दर्शाया जाता है ।


2
साथ ही एक हैशबंग।
Naftuli Kay

1

यदि आपके पास पायथन के कई संस्करण स्थापित हैं, तो /usr/bin/envयह सुनिश्चित करेगा कि इस्तेमाल किया जाने वाला दुभाषिया आपके पर्यावरण पर पहला है $PATH। इसका विकल्प कुछ इस तरह से हार्डकोड करना होगा #!/usr/bin/python;

यूनिक्स में, एक निष्पादन योग्य फ़ाइल जिसकी व्याख्या की जा सकती है, यह इंगित कर सकती है कि #!पहली पंक्ति की शुरुआत में, दुभाषिया (और किसी भी झंडे की आवश्यकता हो सकती है) का उपयोग करके क्या दुभाषिया का उपयोग किया जा सकता है।

यह नियम केवल UNIX आधारित प्रणाली के लिए लागू है।


0

लिनक्स के लिए OS की तरह उपयोगी जहां पायथन 2.x अभी भी मानक है, लेकिन अधिकांश लोग 3.x भी डाउनलोड करते हैं।

2.x डिफ़ॉल्ट रूप से चलेगा। तो मेरा 3.x कोड, मैं # के साथ उपसर्ग करता हूं! / Usr / bin / env python3 ताकि 3.x कोड चलाता है। मैं मामूली संशोधन (अजगर 3. प्रॉक्सी) को भी निर्दिष्ट कर सकता हूं यदि मैंने बीटा रिलीज़ या थोड़े पुराने संस्करणों को चुना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.