2008-09-02 17 views
12

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

if sys.version_info < (2, 4): 
    raise ImportError("Cannot run with Python version < 2.4") 

मैं हर निष्पादन योग्य फ़ाइल पर कुटिया लाइन बदलने के लिए, अगर यह संभव है करने के लिए नहीं करना चाहते हैं; हालांकि, मैं env python का परिणाम बदलने के लिए मशीन के लिए प्रशासनिक पहुँच नहीं है और मैं, एक विशेष संस्करण के लिए मजबूर करने के रूप में नहीं करना चाहती:

#!/usr/bin/env python2.4 

मैं चाहूँगा इस प्रणाली क्योंकि हो सकता है से बचने के लिए पाइथन 2.4 की तुलना में एक नया संस्करण है, या पाइथन 2.5 हो सकता है लेकिन कोई पायथन 2.4 नहीं है।

सुरुचिपूर्ण समाधान क्या है?

[संपादित करें:] मैं सवाल खड़ी में पर्याप्त रूप से विशिष्ट नहीं था - मैं उन ~/bin में मैन्युअल कॉन्फ़िगरेशन (जैसे पथ परिवर्तन या symlinking बिना आलेख निष्पादित करने और अपने पथ सुनिश्चित अजगर से पहले ~/bin है और बताना चाहते 2.2 पथ)। शायद मैन्युअल tweaks को रोकने के लिए कुछ वितरण उपयोगिता की आवश्यकता है?

उत्तर

8

"env" बस पाथ एनवी var में पाई जाने वाली पहली चीज़ को निष्पादित करता है। विभिन्न पायथन पर स्विच करने के लिए, अपनी स्क्रिप्ट को आमंत्रित करने से पहले पथ पर उस पायथन के निष्पादन योग्य के लिए निर्देशिका को प्रीपेड करें।

2

आप स्क्रिप्ट चला रहे हैं तो आप एक निजी बिन निर्देशिका पहले भेजने के लिए अपना पथ चर सेट कर सकते हैं:

$ mkdir ~/bin 
$ ln -s `which python2.4` ~/bin/python 
$ export PATH=~/bin:$PATH 

तब जब आप अपने अजगर स्क्रिप्ट को निष्पादित यह अजगर 2.4 का उपयोग करेंगे। आपको अपने पैथ को बदलने के लिए अपनी लॉगिन स्क्रिप्ट बदलनी होगी।

वैकल्पिक रूप से आप चाहते स्पष्ट दुभाषिया के साथ अपने अजगर स्क्रिप्ट चलाने:

$ /path/to/python2.4 <your script> 
4

सुंदर hackish समाधान - अगर आपका चेक विफल रहता है, सबसे अच्छा दुभाषिया उपलब्ध निर्धारित करने के लिए इस समारोह (जो शायद काफी सुधार हो सकता है) का उपयोग करें, यह निर्धारित करें कि यह स्वीकार्य है, और यदि आपकी स्क्रिप्ट को ओएससिस्टम या कुछ समान और आपके sys.argv के साथ नए दुभाषिया का उपयोग करके फिर से लॉन्च करें।

import os 
import glob 
def best_python(): 
    plist = [] 
    for i in os.getenv("PATH").split(":"): 
     for j in glob.glob(os.path.join(i, "python2.[0-9]")): 
      plist.append(os.path.join(i, j)) 
    plist.sort() 
    plist.reverse() 
    if len(plist) == 0: return None 
    return plist[0] 
+0

प्लस, सुझाव देते हैं कि वह निष्पादन योग्य और sys.argv सूची के साथ os.exec का उपयोग करता है। – tzot

0

@ मोराइस: यह एक दिलचस्प विचार है, लेकिन मुझे लगता है कि हम इसे एक कदम आगे ले जा सकते हैं। हो सकता है कि वहाँ के लिए Ian Bicking's virtualenv उपयोग करने के लिए एक तरीका है:

  • अगर हम के साथ शुरू करने के लिए एक स्वीकार्य वातावरण में चला रहे हैं देखो, और यदि हां, तो कुछ भी नहीं।
  • जांचें कि PATH पर कोई संस्करण-विशिष्ट निष्पादन योग्य है या नहीं, यानी जांच करें कि python2.xfor x in reverse(range(4, 10)) मौजूद है या नहीं। यदि ऐसा है, तो बेहतर दुभाषिया के साथ कमांड चलाएं।
  • यदि कोई बेहतर दुभाषिया मौजूद नहीं है, तो Python के पुराने संस्करण से पायथन के एक नए संस्करण को आजमाने और स्थापित करने के लिए वर्चुअलएन्व का उपयोग करें और किसी भी आवश्यक पैकेज प्राप्त करें।

मुझे नहीं पता कि वर्चुअलएन्व इस में सक्षम है, तो मैं जल्द ही इसके साथ गड़बड़ कर दूंगा। :)

+0

यदि आप विंडोज़ पर हैं तो आपके द्वारा वर्णित कुछ तर्क [विंडोज़ के लिए पीईपी 397 पायथन लॉन्चर] से उपलब्ध है [http://www.python.org/dev/peps/pep-0397/) –

0

यहां एक समाधान है यदि आप (1) पूरी तरह से शेबैंग्स का उपयोग करने पर सेट हैं और (2) अपनी बिल्ड प्रक्रिया में ऑटोटूल का उपयोग करने में सक्षम हैं।

मुझे पिछली रात मिली कि आप न्यूनतम पाइथन बाइनरी खोजने के लिए ऑटोकॉन्फ़ मैक्रो AM_PATH_PYTHON का उपयोग कर सकते हैं। कैसे here है।

तो, आपके प्रक्रिया होगी:

  • अंक .py.in करने के लिए अपने configure.ac
  • नाम बदलें अपने .py लिपियों के सभी में एक AM_PATH_PYTHON(2.4) (मेरे अनुभव में, इस भ्रमित नहीं है vi)
  • नाम उन सभी पायथन स्क्रिप्ट्स जिन्हें आप AC_CONFIG_FILES के साथ उत्पन्न करना चाहते हैं।
  • इसके बजाय #!/usr/bin/env python के साथ शुरू की है, का उपयोग #[email protected]@

फिर अपने परिणामी पाइथन स्क्रिप्ट हमेशा एक उपयुक्त मामला होगा।

तो, व्यावहारिक नहीं होने पर, कम से कम संभव है, तो आपके पास यह समाधान है।