2012-08-22 22 views
14

के विभिन्न संस्करणों के लिए सशर्त शीबैंग लाइन दो अलग-अलग कंप्यूटरों पर एक पायथन स्क्रिप्ट चलाने की कोशिश करते समय मुझे कोई समस्या है। प्रत्येक कंप्यूटर पर मैं पाइथन संस्करण 2.7.3 का उपयोग करके स्क्रिप्ट को चलाने के लिए चाहता हूं, हालांकि मेरी समस्या यह है कि दो कंप्यूटरों का नाम पायथन 2.7.3 अलग-अलग तरीकों से है। कंप्यूटरों में से एक आर्क लिनक्स चलाता है और इस कंप्यूटर पर इसे पायथन 2 नाम दिया जाता है। दूसरा कंप्यूटर redhat linux चला रहा है और यह नाम python2.7.3 का उपयोग करता है।पाइथन

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

पीएस मैं सिर्फ आर्क! लिनक्स कंप्यूटर के रूप में #!/Usr/bin/env पायथन का उपयोग नहीं कर सकता, यह पाइथन 3.2.3 और रेडहाट लिनक्स कंप्यूटर पर संदर्भित करेगा, यह पायथन 2.4 का संदर्भ देगा।

+4

एक भव्य सवाल उठाए गए। ध्यान दें कि अनुशंसित अभ्यास (पीईपी -394 के अनुसार), सुझाव देता है कि python2.x को 'पायथन 2' के रूप में सिम्लिंक किया जाना चाहिए, इसलिए वास्तव में यह रेडहाट की ओर से एक पैकेजिंग मुद्दा है (अन्य डिस्ट्रोज़ के साथ)। – WhyNotHugo

+2

आप प्रत्येक कंप्यूटर में एक नया चर परिभाषित क्यों नहीं कर सकते हैं जो python2.7.3 से लिंक होगा? या सिर्फ एक लिंक? – slallum

+2

आप हमेशा 'python2.7.3 my-program.py' के साथ जा सकते हैं :) – Shaung

उत्तर

5

आप एक छोटी रैपर स्क्रिप्ट लिख सकते हैं जो पाइथन निष्पादन योग्य के विभिन्न संस्करणों को देखता है और जो इसे पाता है उसका उपयोग करता है।

उदाहरण के लिए:

#!/bin/sh -e 
pythons=('python2', 'python2.7.3') 
for py_exec in ${pythons[@]}; do 
    py_exec="/usr/bin/$py_exec" 
    if [[ -f $py_exec ]]; then 
     exec $py_exec $1 
    fi 
done 

बेशक इस स्क्रिप्ट सिर्फ एक शुरुआत नमूना है, तो आप निश्चित रूप से कई मायनों में यह सुधार सकता है। बस मुझे इसका मतलब है कि मेरा क्या मतलब है।

6
#!/bin/sh 
# -*- mode: Python -*- 

""":" 
# bash code here; finds a suitable python interpreter and execs this file. 
# prefer unqualified "python" if suitable: 
python -c 'import sys; sys.exit(not (0x020500b0 < sys.hexversion < 0x03000000))' 2>/dev/null \ 
    && exec python "$0" "[email protected]" 
for pyver in 2.6 2.7 2.5; do 
    which python$pyver > /dev/null 2>&1 && exec python$pyver "$0" "[email protected]" 
done 
echo "No appropriate python interpreter found." >&2 
exit 1 
":""" 

import sys 
print sys.version 

से https://github.com/apache/cassandra/blob/trunk/bin/cqlsh