2010-06-27 13 views
58

ठेठ हैडरपायथॉन लिपि हैडर

#!/usr/bin/env python 

होना चाहिए लेकिन मैं नीचे पाया भी जब $python ./my_script.py

#!/usr/bin/python 
#!python 

इन 2 हेडर में क्या फ़र्क है की तरह स्क्रिप्ट निष्पादित काम करता है? दूसरे के लिए समस्या क्या हो सकती है? पाइथन दुभाषिया के मामले में पैथ में या नहीं, इस मामले पर भी चर्चा करें। धन्यवाद।

+2

कि शीर्ष लेख कुटिया http://en.wikipedia.org/wiki/Shebang_%28Unix%29 – systempuntoout

+3

FYI करें जब आप ढंग '$ अजगर में एक स्क्रिप्ट।/My_script.py' चलाने (निर्दिष्ट करने' python' स्पष्ट रूप से कहा जाता है), शेबांग ('#!') लाइन को अनदेखा किया जाता है। इसका प्रभाव केवल तभी होता है जब आप स्क्रिप्ट को निष्पादन योग्य के रूप में चलाते हैं, उदा। '$।/my_script.py'। –

+0

@ डेविड ज़ास्लावस्की: +1 अच्छी पकड़। –

उत्तर

70

सबसे पहले, आप के रूप में स्पष्ट रूप से दुभाषिया का उपयोग कर एक स्क्रिप्ट चलाने,

$ python ./my_script.py 
$ ksh ~/bin/redouble.sh 
$ lua5.1 /usr/local/bin/osbf3 

#! लाइन हमेशा अनदेखा की जाती है। #! लाइन निष्पादन योग्य स्क्रिप्ट्स की यूनिक्स सुविधा है, और आप इसे man page for execve(2) पर पूर्ण रूप से प्रलेखित देख सकते हैं। वहां आप पाएंगे कि #! का पालन करने वाला शब्द वैध निष्पादन योग्य का पथनाम होना चाहिए। तो

#!/usr/bin/env python 

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

इसके बाद, सामान्य स्थिति है कि एक अजगर दुभाषिया /usr/bin में स्थापित किया गया है के साथ

#!/usr/bin/python 

से संबंधित है। अगर यह कहीं और स्थापित है, तो आप हार जाते हैं।लेकिन इस

#!/usr/bin/python2.5 

अंत में के रूप में एक अच्छा तरीका है कि आप सुनिश्चित करने के लिए सभी पर आप चाहते हैं वास्तव में संस्करण या और कुछ नहीं ("असफल-स्टॉप" व्यवहार) है,

#!python 

केवल तभी काम करता है स्क्रिप्ट चलने पर वर्तमान निर्देशिका में python निष्पादन योग्य है। सिफारिश नहीं की गई।

1

हां, वहां है - पाइथन /usr/bin में नहीं हो सकता है, लेकिन उदाहरण के लिए /usr/local/bin (बीएसडी) में।

virtualenv का उपयोग कर, यह भी हो सकता है की तरह कुछ ~/projects/env/bin/python

5

पायथन निष्पादन/usr/bin के अलावा किसी अन्य स्थान पर स्थापित किया जा सकता है, लेकिन env लगभग हमेशा इतनी का उपयोग कर /usr/bin/env अधिक पोर्टेबल है कि स्थान में मौजूद है ।

2

env के लिए मैनपेज से (GNU coreutils 6.10):

env - run a program in a modified environment 

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

0

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

के रूप में अधिक से अधिक लोगों अजगर विकास के लिए इस्तेमाल किया virtualenv शुरू कर दिया है जब तक आप लोगों को अपने कस्टम अजगर द्विआधारी का उपयोग नहीं करना चाहते हैं /usr/bin/env python उपयोग करने के लिए पसंद करते हैं।

नोट: आपको यह भी समझना चाहिए कि संभावित सुरक्षा समस्याएं हैं (बहुउद्देशीय वातावरण में) जब आप लोगों को अपने कस्टम वातावरण में अपनी स्क्रिप्ट चलाने देते हैं। आप here से कुछ विचार प्राप्त कर सकते हैं।

16


मैं अपनी स्क्रिप्ट की शुरुआत में 3 चीजें सुझाव देंगे:

पहले, पहले से ही कहा जा रहा है उपयोग वातावरण के रूप में:

# -*- coding: utf-8 -*- 
:

#!/usr/bin/env python 

दूसरा, अपने एन्कोडिंग सेट

तीसरा, कुछ डॉक्टर स्ट्रिंग सेट करें:

"""This is a awesome 
    python script!""" 

और निश्चित रूप से मैं पहचान के लिए " " (4 रिक्त स्थान) का उपयोग करूंगा।

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

"""This is a awesome 
     python script!""" 


शुभकामनाएं और कोडिंग खुश:
अंतिम शीर्षलेख ऐसा दिखाई देगा।