क्या मुझे # लगाना चाहिए! (शेबंग) पायथन लिपियों में, और इसे किस रूप में लेना चाहिए?


827

क्या मुझे अपनी पाइथन लिपियों में शेबंग लगाना चाहिए? किस रूप में?

#!/usr/bin/env python 

या

#!/usr/local/bin/python

क्या ये समान रूप से पोर्टेबल हैं? किस रूप का उपयोग सबसे अधिक किया जाता है?

नोट: बवंडर परियोजना कुटिया उपयोग करता है। दूसरी ओर Django परियोजना नहीं है।


70
दूसरा एक पोर्टेबल नहीं है और कई कंप्यूटरों पर विफल हो जाएगा , यदि अधिकांश नहीं।
डायट्रिच एप्प

4
#!/usr/bin/pythonपहले विकल्प की तुलना कैसे की जाती है ? मैं इसे काफी उदाहरण कोड में देखता हूं। संपादित करें: हो सकता है कि यह उत्तर हो .. stackoverflow.com/a/2429517/1156245
जियोथेट्री


1
मैं कहता हूं कि हमेशा इसका इस्तेमाल करें, क्यों? "पायथन का ज़ेन" - लाइन 2 - "स्पष्ट है निहित से बेहतर है।" python.org/dev/peps/pep-0020
JayRizzo

2
सच कहूं तो, न तो "सही" है, क्योंकि आप लेखक के रूप में नहीं जानते हैं कि स्क्रिप्ट चलाने के दौरान पायथन का सही संस्करण कहां होगा। सही शेबंग को जोड़ने के लिए इंस्टॉलर का काम होना चाहिए ।
1

जवाबों:


1116

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

पायथन 3 लिपियों के लिए सही उपयोग है:

#!/usr/bin/env python3

यह संस्करण 3.latest में चूक करता है। अजगर 2.7.latest उपयोग के लिए python2के स्थान पर python3

निम्नलिखित का उपयोग नहीं किया जाना चाहिए (दुर्लभ मामले को छोड़कर जो आप कोड लिख रहे हैं जो कि पायथन 2.x और 3.x दोनों के साथ संगत है):

#!/usr/bin/env python

पीईपी 394 में दी गई इन सिफारिशों का कारण यह है कि विभिन्न प्रणालियों पर या pythonतो इसका उल्लेख किया जा सकता है। यह वर्तमान में अधिकांश वितरणों को संदर्भित करता है , लेकिन यह कुछ बिंदु पर बदलने की संभावना है।python2python3python2

इसके अलावा, उपयोग न करें:

#!/usr/local/bin/python

"अजगर उन मामलों में / usr / bin / python या / bin / python में स्थापित हो सकता है, उपरोक्त # विफल हो जाएगा।"

- "#! / usr / bin / env python" बनाम "#! / usr / स्थानीय / बिन / अजगर"


4
@EliasVanOotegem यदि आप निश्चित नहीं हो सकते हैं कि अजगर /usr/binतब मिल जाएगा, तो आप कैसे निश्चित हो सकते हैं कि इसमें envपाया जाएगा /usr/bin। यदि अजगर गैर-मानक स्थान पर स्थापित किया गया है, तो इसका मतलब है कि अजगर गैर-मानक तरीके से सेटअप है और परिणामस्वरूप स्क्रिप्ट को तेजी से विफल होना चाहिए। के रूप में अजगर दुभाषिया के गुणों के बारे में धारणा बनाने का विरोध किया और सबसे अच्छा के लिए उम्मीद है।
टिब्बा

65
@Dunes: envजाएगा हमेशा में पाया जा /usr/bin/, और अपना काम (अजगर) की तरह डिब्बे का पता लगाने का उपयोग कर रहा है PATH। कोई भी बात नहीं है कि अजगर कैसे स्थापित किया जाता है, इसका मार्ग इस चर में जोड़ा envजाएगा , और इसे ढूंढेगा (यदि नहीं, तो अजगर स्थापित नहीं है)। यह काम है env, यही कारण है कि यह मौजूद है। यह वह चीज़ है जो पर्यावरण को सचेत करती है (स्थापित पथों सहित env चर सेट करें, और पथ शामिल करें)। लोगों ने हमेशा समझा है कि यह कमांड केवल तभी काम कर सकता है जब यह हमेशा एक ही स्थान पर पाया जाए। यह सिर्फ एक दिया गया है
एलियास वान ओटगेम

3
@ जेएफसैबस्टियन: आप सही हैं, इसकी गारंटी नहीं है, या पोसिक्स मानक द्वारा लागू किया गया है। मुझे लगता है कि यह इसलिए था क्योंकि बाद के IEEE संस्करणों में से एक में कुछ पर्यावरण सामग्री थी। किसी भी तरह से: नहीं, /usr/bin/envकिसी भी मानक द्वारा गारंटी नहीं है, एक व्यापक (सार्वभौमिक रूप से) के अलावा अन्य किसी भी नियम को अपनाया ...
एलियास वान ओटेगेम

6
अगर आप virtualenv, #! / Usr / local / bin / python का उपयोग कर रहे हैं, तो भी यह मौजूद है, गलत है।
nullas

6
इसके साथ एक समस्या: PEP394 के अनुसार किसी को केवल pythonनिष्पादन योग्य का उपयोग करना चाहिए जब स्क्रिप्ट पायथन 2 और पायथन 3 के साथ संगत हो। अन्यथा, इसे python2और से उपयुक्त विकल्प को इंगित करना चाहिए python3
एमिलर 27

67

यह वास्तव में सिर्फ स्वाद की बात है। शेबबैंग को जोड़ने का मतलब है कि लोग स्क्रिप्ट को सीधे ही लागू कर सकते हैं यदि वे चाहते हैं (यह मानते हुए कि यह निष्पादन योग्य है); इसे छोड़ने का मतलब pythonहै कि इसे मैन्युअल रूप से लागू करना होगा।

कार्यक्रम चलाने का अंतिम परिणाम किसी भी तरह से प्रभावित नहीं होता है; यह सिर्फ साधनों का विकल्प है।


3
बस यही है - इससे कोई फर्क नहीं पड़ता कि आप किस पक्ष को लेते हैं क्योंकि "सही" पक्ष नहीं है। यह पूरी तरह से व्यक्तिपरक निर्णय है।
अंबर

5
किसी भी अन्य तुच्छ निर्णय से अधिक नहीं। en.wikipedia.org/wiki/Parkinson's_Law_of_Triviality
Amber

2
मैं 'अजगर' कमांड के बिना सीधे एक अजगर फ़ाइल को कैसे निष्पादित कर सकता हूं?
ज़ेन

5
@ ज़ेन मान लें कि आपने अपनी स्क्रिप्ट में शेबंग (#! / Usr / bin / env python) को शामिल किया है, आपको बस अपनी स्क्रिप्ट को निष्पादन योग्य बनाने की आवश्यकता है। कुछ ऐसा chmod a+x [your-script].pyकरना चाहिए जो इसे क्रियान्वित करे और फिर आप केवल ./[your-script.py]शेल में कॉल कर सकते हैं ।
skålfyfan

9
GlassGhost द्वारा दिए गए उत्तर के अनुसार, स्वाद के अलावा इसे शामिल करने का एक ठोस लाभ है: यह उस फ़ाइल के भविष्य के पाठक को स्पष्ट करता है कि वे एक निष्पादन योग्य स्क्रिप्ट पढ़ रहे हैं, बजाय एक फ़ाइल के जिसे आयात किया जाना है। इसी तरह, सार्वजनिक / निजी एक्सेस कंट्रोल मॉडिफायर भाषाओं में जो उनके पास हैं, शेबंग प्रलेखन के साथ-साथ उनके वास्तविक प्रभाव के लिए उपयोगी होते हैं , और कुछ मामलों में प्रलेखन पहलू वास्तव में सबसे ज्यादा मायने रखता है।
मार्क अमेरी

32

क्या मुझे अपनी पाइथन लिपियों में शेबंग लगाना चाहिए?

इंगित करने के लिए एक अजगर को एक पायथन स्क्रिप्ट में डालें:

  • इस मॉड्यूल को स्क्रिप्ट के रूप में चलाया जा सकता है
  • क्या इसे केवल python2, python3 पर चलाया जा सकता है या क्या यह Python 2/3 संगत है
  • यदि आप pythonस्पष्ट रूप से निष्पादन योग्य को लागू किए बिना स्क्रिप्ट चलाना चाहते हैं, तो POSIX पर यह आवश्यक है

क्या ये समान रूप से पोर्टेबल हैं? किस रूप का उपयोग सबसे अधिक किया जाता है?

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

नोट: स्थापित स्क्रिप्ट को एक विशिष्ट अजगर निष्पादन योग्य का उपयोग करना चाहिए जैसे, /usr/bin/pythonया /home/me/.virtualenvs/project/bin/python। यदि आप अपने शेल में एक वर्चुअन को सक्रिय करते हैं तो कुछ उपकरण टूट जाता है तो यह बुरा है। सौभाग्य से, सही शेबंग स्वचालित रूप से setuptoolsया आपके वितरण पैकेज टूल (विंडोज पर, स्वचालित रूप से setuptoolsआवरण .exeस्क्रिप्ट उत्पन्न कर सकते हैं ) द्वारा ज्यादातर मामलों में बनाया जाता है ।

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

चयन करने के लिए है कि क्या आप का उपयोग करना चाहिए python, python2या python3कुटिया में, देखने के पीईपी 394 - पर यूनिक्स सिस्टम "अजगर" कमांड :

  • ... pythonशेब लाइन में केवल उन लिपियों के लिए उपयोग किया जाना चाहिए जो पायथन 2 और 3 दोनों के साथ संगत हैं।

  • पायथन के डिफ़ॉल्ट संस्करण में एक अंतिम बदलाव की तैयारी में, पायथन 2 केवल लिपियों को या तो पायथन 3 के साथ संगत होने के लिए अद्यतन किया जाना चाहिए या फिर python2शेबंग लाइन में उपयोग करने के लिए ।


3
यहां तक ​​कि एक पीईपी को संदर्भित करने के लिए पहला जवाब पर्याप्त upvotes नहीं है। है ना? क्या #!/usr/bin/env pythonअपने लिए एक पीईपी है?
बिंकी

कृपया उपयोग न करें #!/usr/bin/env python। कृपया "हमेशा उपयोग करने" का सुझाव न दें #!/usr/bin/env python। 99% मामलों में ऐसा करना गलत बात है (कारण जो आपने अपने उत्तर में शामिल किया है)।
जे। सुलिवन

1
@JaySullivan क्या आप एक स्रोत चेकआउट और स्थापित स्क्रिप्ट के बीच अंतर को समझते हैं? मैं सुझाव के पीछे खड़ा हूं। यह अच्छा काम करता है।
jfs

1
@jfs: मेरी टिप्पणी को फिर से पढ़ने के बाद, मैं देखता हूं कि मैं अपनी बात को पूरी तरह से विफल करने में कैसे विफल रहा। मेरे कहने का मतलब यह था कि ज्यादातर लोग 'अजगर' या 'अजगर 3' का इस्तेमाल करना चाहेंगे, न कि 'अजगर' का। पूर्ण पथ या एनवी के माध्यम से हल करना या न करना, जो तकनीकी रूप से ओपी प्रश्न था, आपने उत्तर दिया है और मैं उस बिंदु पर असहमत नहीं हूं।
जय सुलिवन

@JaySullivan मैं सहमत हूँ। क्या आपने जवाब में पेप से उद्धरण पढ़ा। यह एक ही बात कहता है।
17

15

यदि आपके पास पायथन का एक से अधिक संस्करण है और स्क्रिप्ट को एक विशिष्ट संस्करण के तहत चलाने की आवश्यकता है, तो वह सुनिश्चित कर सकती है कि स्क्रिप्ट के सीधे निष्पादित होने पर सही का उपयोग किया जाए, उदाहरण के लिए:

#!/usr/bin/python2.7

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

#!/usr/bin/env python आम तौर पर बेहतर दृष्टिकोण है, लेकिन यह विशेष मामलों के साथ मदद करता है।

आमतौर पर पायथन वर्चुअल वातावरण को स्थापित करना बेहतर होगा, जिस स्थिति में जेनेरिक #!/usr/bin/env pythonवर्चुअलवेव के लिए पायथन के सही उदाहरण की पहचान करेगा।


क्या यह स्थान विफल होने का कारण नहीं है?
रैंडमइन्सानो

1
@RandomInsano, मुझे ऐसा नहीं लगता। रिक्त स्थान बहुत ही सामान्य लगते हैं और एक स्वीकृत उपयोग के रूप में इस के नेट के आसपास बहुत सारे सबूत हैं। हालाँकि मुझे लगता है कि नो-स्पेस शायद अधिक विहित उपयोग है।
क्रिस जॉनसन

1
आप निश्चित रूप से इस पर सही हैं। बस बैश और tcsh पर परीक्षण किया।
रैंडमइन्सानो

के परिणाम whichआपको एक स्ट्रिंग देंगे जो काम करेंगे, अवधि। इसका उपयोग करने के लिए आपको किसी भी हिम्मत की चिंता करने की आवश्यकता नहीं है।
एसडीसोलर

10

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


1
आपको # संशोधित करने की आवश्यकता नहीं है! बाद में लाइन। यही / usr / bin / env किस लिए है एक विशिष्ट पायथन दुभाषिया के खिलाफ हार्ड-कोडिंग अच्छे से अधिक नुकसान कर सकती है। यह एक और पायथन संस्करण स्थापित करने या हमारे डिस्ट्रो पायथन के बीच एक कस्टम पायथन इंस्टॉलेशन के बीच स्विच करने के बारे में बहुत नाजुक है।
वोग

उबंटू में, के परिणामों का उपयोग करके whichस्वचालित रूप से डिफ़ॉल्ट को चुन लेंगे जो सिस्टम कमांड और इस तरह से उपयोग किया जा रहा है। यह सामान्य है और सिस्टम इसे समुचित स्थापना के लिए सक्षम करता है।
एसडीसोलर

9

शेलंग का उद्देश्य स्क्रिप्ट के लिए दुभाषिया प्रकार को पहचानना है, जब आप स्क्रिप्ट को शेल से निष्पादित करना चाहते हैं। ज्यादातर, और हमेशा नहीं, आप बाह्य रूप से दुभाषिया की आपूर्ति करके स्क्रिप्ट निष्पादित करते हैं। उदाहरण उपयोग:python-x.x script.py

यह तब भी काम करेगा जब आपके पास एक शेबंग घोषणाकर्ता नहीं होगा।

क्यों पहले एक अधिक "पोर्टेबल" है, क्योंकि /usr/bin/envआपकी PATHघोषणा में उन सभी गंतव्यों के लिए खाते हैं, जहां आपके सिस्टम के निष्पादन योग्य हैं।

नोट: बवंडर कड़ाई से उपयोग नहीं करता है, और Django कड़ाई से नहीं करता है। यह इस बात से भिन्न होता है कि आप अपने एप्लिकेशन के मुख्य कार्य को कैसे अंजाम दे रहे हैं।

ALSO: यह पायथन के साथ भिन्न नहीं है।


8

कभी कभी, अगर जवाब बहुत स्पष्ट नहीं है (मैं आप अगर हाँ या नहीं तय नहीं कर सकता मतलब), तो यह बात बहुत ज्यादा होता है, और जब तक इस सवाल का जवाब आप इस समस्या को अनदेखा कर सकते हैं है स्पष्ट।

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

आम तौर पर, यदि यह एक मॉड्यूल है और स्क्रिप्ट के रूप में उपयोग नहीं किया जा सकता है, तो उपयोग करने की कोई आवश्यकता नहीं है #!। दूसरी ओर, एक मॉड्यूल स्रोत में अक्सर if __name__ == '__main__': ...कार्यक्षमता के कम से कम कुछ तुच्छ परीक्षण होते हैं। तब फिर से #!समझ में आता है।

उपयोग करने का एक अच्छा कारण #!यह है कि जब आप पायथन 2 और पायथन 3 दोनों लिपियों का उपयोग करते हैं - तो उन्हें पायथन के विभिन्न संस्करणों द्वारा व्याख्या की जानी चाहिए। इस तरह, आपको यह याद रखना pythonहोगा कि स्क्रिप्ट को मैन्युअल रूप से लॉन्च करते समय ( #!अंदर के बिना ) क्या उपयोग किया जाना चाहिए । यदि आपके पास इस तरह की लिपियों का मिश्रण है, तो #!अंदर का उपयोग करना , उन्हें निष्पादन योग्य बनाना और उन्हें निष्पादन योग्य (चामोद ...) के रूप में लॉन्च करना एक अच्छा विचार है ।

एमएस-विंडोज का उपयोग करते समय, #!कोई मतलब नहीं था - हाल ही में जब तक। पायथन 3.3 एक विंडोज पायथन लॉन्चर (py.exe और pyw.exe) का परिचय देता है जो #!लाइन को पढ़ता है , पायथन के स्थापित संस्करणों का पता लगाता है, और पायथन के सही या स्पष्ट रूप से वांछित संस्करण का उपयोग करता है। चूंकि एक्सटेंशन एक प्रोग्राम से जुड़ा हो सकता है, आप विंडोज में उसी तरह का व्यवहार प्राप्त कर सकते हैं जैसे यूनिक्स-आधारित सिस्टम में फ्लैग को निष्पादित करते हैं।


3

जब मैंने हाल ही में विंडोज 7 पर पायथन 3.6.1 स्थापित किया, तो इसने विंडोज के लिए पायथन लॉन्चर भी स्थापित किया, जो कि शेबंग लाइन को संभालने वाला है। हालांकि, मैंने पाया कि पायथन लॉन्चर ने ऐसा नहीं किया था: शेलबैंग लाइन को नजरअंदाज कर दिया गया था और पायथन 2.7.13 का हमेशा उपयोग किया गया था (जब तक कि मैंने पी -3 का उपयोग करके स्क्रिप्ट निष्पादित नहीं की थी)।

इसे ठीक करने के लिए, मुझे विंडोज रजिस्ट्री कुंजी को संपादित करना पड़ा HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command। यह अभी भी मूल्य था

"C:\Python27\python.exe" "%1" %*

मेरे पहले पायथन 2.7 स्थापना से। मैंने इस रजिस्ट्री कुंजी मान को संशोधित किया है

"C:\Windows\py.exe" "%1" %*

और पायथन लॉन्चर शेलबैंग लाइन प्रोसेसिंग ने ऊपर वर्णित के रूप में काम किया।


2

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

#!/bin/sh
#
# Choose the python we need. Explanation:
# a) '''\' translates to \ in shell, and starts a python multi-line string
# b) "" strings are treated as string concat by python, shell ignores them
# c) "true" command ignores its arguments
# c) exit before the ending ''' so the shell reads no further
# d) reset set docstrings to ignore the multiline comment code
#
"true" '''\'
PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    echo Using preferred python $PREFERRED_PYTHON
    exec $PREFERRED_PYTHON "$0" "$@"
elif [ -x $ALTERNATIVE_PYTHON ]; then
    echo Using alternative python $ALTERNATIVE_PYTHON
    exec $ALTERNATIVE_PYTHON "$0" "$@"
else
    echo Using fallback python $FALLBACK_PYTHON
    exec python3 "$0" "$@"
fi
exit 127
'''

__doc__ = """What this file does"""
print(__doc__)
import platform
print(platform.python_version())

या बेहतर अभी तक, शायद, कई अजगर लिपियों में कोड पुन: उपयोग की सुविधा के लिए:

#!/bin/bash
"true" '''\'; source $(cd $(dirname ${BASH_SOURCE[@]}) &>/dev/null && pwd)/select.sh; exec $CHOSEN_PYTHON "$0" "$@"; exit 127; '''

और फिर select.sh है:

PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    CHOSEN_PYTHON=$PREFERRED_PYTHON
elif [ -x $ALTERNATIVE_PYTHON ]; then
    CHOSEN_PYTHON=$ALTERNATIVE_PYTHON
else
    CHOSEN_PYTHON=$FALLBACK_PYTHON
fi

1
हालांकि मुझे यकीन नहीं है कि इस तरह का एक बहुवचन सामान्य रूप में अच्छा अभ्यास है, यह निश्चित रूप से बहुत दिलचस्प दृष्टिकोण है, और शायद यहां सबसे लचीला जवाब है।
रयान एमोस

1
बहुत ही शांत। मुझे एहसास नहीं था कि आप ऐसा कर सकते हैं
user2233949

1

उत्तर: केवल यदि आप इसे कमांड-लाइन निष्पादन योग्य स्क्रिप्ट बनाने की योजना बनाते हैं।

यहाँ प्रक्रिया है:

उपयोग करने के लिए उचित शेबंग स्ट्रिंग की पुष्टि करके शुरू करें:

which python

उस से आउटपुट लें और इसे पहली पंक्ति में (शेबंग # के साथ) जोड़ें।

मेरे सिस्टम पर यह इस तरह से प्रतिक्रिया करता है:

$which python
/usr/bin/python

तो आपका शेबंग ऐसा दिखेगा:

#!/usr/bin/python

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

python filename.py

इसे एक कमांड बनाने के लिए, इसे .py एक्सटेंशन को छोड़ने के लिए कॉपी करें।

cp filename.py filename

फ़ाइल सिस्टम को बताएं कि यह निष्पादन योग्य होगा:

chmod +x filename

इसका परीक्षण करने के लिए, इसका उपयोग करें:

./filename

सबसे अच्छा अभ्यास यह है कि इसे अपने $ PATH में कहीं स्थानांतरित किया जाए, इसलिए आपको केवल नाम लिखना है।

sudo cp filename /usr/sbin

इस तरह यह हर जगह काम करेगा (फ़ाइल नाम से पहले / के बिना)


मुझे संदेह है कि यह सबसे अच्छा अभ्यास है और मैं ग्लासगॉस्ट के समाधान का उपयोग करने की दृढ़ता से सलाह देता हूं ।
कोलीडर

मुझे यह मददगार लगा और इसने मेरे लिए खूबसूरती से काम किया। यह अच्छी तरह से समझाया गया था। हालांकि, यह बताने के लिए कि यह एक सर्वोत्तम अभ्यास क्यों नहीं है, मैं टिप्पणियों की सराहना करता हूं। मैं सीखने के लिए उत्सुक हूं।
चार्ल्स कैरिरे

0

पूर्ण बनाम तार्किक पथ:

यह वास्तव में एक सवाल है कि क्या पोर्टेबिलिटी के संबंध में पायथन दुभाषिया का मार्ग निरपेक्ष या लॉजिकल ( /usr/bin/env) होना चाहिए ।

इस और अन्य स्टैक साइटों पर अन्य उत्तरों का एनकाउंटर करते हुए जो बिना सबूत के समर्थन के सामान्य तरीके से इस मुद्दे के बारे में बात करते थे, मैंने कुछ वास्तव में, वास्तव में , ग्रेनाइट परीक्षण और विश्लेषण unix.stackexchange.com पर किया है । यहाँ उस उत्तर को चिपकाने के बजाय, मैं उस उत्तर के तुलनात्मक विश्लेषण के इच्छुक लोगों को इंगित करूँगा:

https://unix.stackexchange.com/a/566019/334294

लिनक्स इंजीनियर होने के नाते, मेरा लक्ष्य हमेशा अपने डेवलपर क्लाइंट के लिए सबसे उपयुक्त, अनुकूलित होस्ट प्रदान करना है, इसलिए पायथन वातावरण का मुद्दा कुछ ऐसा था जिसकी मुझे वास्तव में ठोस जवाब की जरूरत थी। परीक्षण के बाद मेरा विचार यह था कि शी-बैंग में तार्किक पथ (2) विकल्पों में से बेहतर था।


-3

पहले प्रयोग करो

which python

यह आउटपुट को उस स्थान के रूप में देगा जहां मेरा अजगर इंटरप्रेटर (बाइनरी) मौजूद है।

यह आउटपुट कोई भी हो सकता है

/usr/bin/python

या

/bin/python

अब उचित रूप से शेबंग लाइन का चयन करें और इसका उपयोग करें।

सामान्यीकृत करने के लिए हम उपयोग कर सकते हैं:

#!/usr/bin/env

या

#!/bin/env

3
यह संभवतः अन्य प्रणालियों के लिए पोर्टेबल नहीं होगा। #!/usr/bin/envआपके लिए सही विकल्प बनाता है।
fragmentedreality

इसलिए आप whichकमांड का उपयोग करते हैं - यह आपके विशेष सिस्टम के लिए सही स्ट्रिंग लौटाएगा।
एसडीसोलर

1
... और फिर हर बार स्क्रिप्ट को किसी अन्य मशीन पर निष्पादित किया जाना है, आप which pythonफिर से चलाते हैं और स्क्रिप्ट को बदलते हैं यदि आउटपुट वर्तमान शेलबैंग से भिन्न होता है
खंडित किए जाने योग्य

2
-1 यह सबसे नाजुक संभव समाधान है। यह केवल उस सिस्टम के लिए सही होने की गारंटी है जिस पर आपकी पाइथन स्क्रिप्ट लिखी गई है। पोर्टेबिलिटी के लिए #! / Usr / bin / env python3 का उपयोग करें
Myles Hollowed
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.