मैं थोड़ी दिलचस्प स्थिति में हूं जहां मेरे पास एक पायथन स्क्रिप्ट है जो सैद्धांतिक रूप से विभिन्न प्रकार के वातावरण (और PATH) और विभिन्न लिनक्स सिस्टमों के साथ विभिन्न उपयोगकर्ताओं द्वारा चलाया जा सकता है। मैं चाहता हूं कि यह स्क्रिप्ट कृत्रिम प्रतिबंधों के बिना इनमें से कई पर अमल कर सके। यहाँ कुछ ज्ञात सेटअप हैं:
- अजगर 2.6 प्रणाली पायथन संस्करण है, इसलिए अजगर, अजगर 2, और अजगर 2.6 सभी / usr / bin में मौजूद हैं (और समतुल्य हैं)।
- पायथन 2.6 सिस्टम पायथन संस्करण है, जैसा कि ऊपर है, लेकिन पायथन 2.7 को python2.7 के रूप में स्थापित किया गया है।
- पायथन 2.4 सिस्टम पायथन संस्करण है, जो मेरी स्क्रिप्ट का समर्थन नहीं करता है। / Usr / bin में हमारे पास python, python2, और python2.4 हैं जो समकक्ष हैं, और python2.5, जो स्क्रिप्ट समर्थन करती है।
मैं इन तीनों पर समान निष्पादन योग्य स्क्रिप्ट चलाना चाहता हूं। यह अच्छा होगा यदि यह पहले /usr/bin/python2.7 का उपयोग करने की कोशिश करता है, यदि यह मौजूद है, तो /usr/bin/python2.6 पर वापस गिरें, फिर वापस /usr/bin/python2.5 पर जाएं, फिर यदि उनमें से कोई भी मौजूद नहीं था, तो बस त्रुटि। जब तक यह संभव है, तब तक मैं सबसे हाल ही में 2.x का उपयोग करके इसे लटका नहीं सकता, हालांकि जब तक यह सही व्याख्याकारों में से एक को खोजने में सक्षम नहीं है।
मेरा पहला झुकाव शेबंग लाइन को इससे बदलना था:
#!/usr/bin/python
सेवा
#!/usr/bin/python2.[5-7]
चूँकि यह बैश में ठीक काम करता है। लेकिन स्क्रिप्ट चलाना देता है:
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
ठीक है, इसलिए मैं निम्नलिखित कोशिश करता हूं, जो भी काम करता है:
#!/bin/bash -c /usr/bin/python2.[5-7]
लेकिन फिर, इस के साथ विफल रहता है:
/bin/bash: - : invalid option
ठीक है, जाहिर है कि मैं एक अलग शेल स्क्रिप्ट लिख सकता हूं जो सही दुभाषिया पाता है और जो भी दुभाषिया मिला है उसका उपयोग करके अजगर स्क्रिप्ट चलाता है। मैं इसे केवल दो फ़ाइलों को वितरित करने के लिए एक परेशानी पाऊँगा जहाँ किसी को सबसे अधिक समय तक चलने वाले पायथन 2 इंटरप्रेटर के साथ चलना चाहिए। लोगों से दुभाषिया को स्पष्ट रूप से लागू करने के लिए $ python2.5 script.py
कहना (उदाहरण के लिए ) एक विकल्प नहीं है। उपयोगकर्ता के पेट पर एक निश्चित तरीके से स्थापित होना भी एक विकल्प नहीं है।
संपादित करें:
पायथन लिपि के भीतर संस्करण की जाँच से काम चलने वाला नहीं है क्योंकि मैं "विथ" कथन का उपयोग कर रहा हूँ जो कि पायथन 2.6 के रूप में मौजूद है (और इसका उपयोग 2.5 के साथ किया जा सकता है from __future__ import with_statement
)। इसका कारण यह है कि स्क्रिप्ट उपयोगकर्ता-अनफ्रेंडली सिंटेक्सट्राय के साथ तुरंत विफल हो जाती है, और मुझे पहले संस्करण की जांच करने और एक उपयुक्त त्रुटि का मौका देने से कभी भी रोकती है।
उदाहरण: (इसे पायथन इंटरप्रेटर के साथ 2.6 से कम करके देखें)
#!/usr/bin/env python
import sys
print "You'll never see this!"
sys.exit()
with open('/dev/null', 'w') as out:
out.write('something')
./script.py
) इसे निष्पादित करने के लिए python2.4 का कारण बनेगा, जो आपके कोड को यह पता लगाने का कारण होगा कि यह गलत संस्करण था (और संभवतः, छोड़ दिया गया)। लेकिन वहाँ एक अच्छा python2.5 है कि दुभाषिया के रूप में इस्तेमाल किया जा सकता है!
exec
यह पता लगाने के लिए एक आवरण स्क्रिप्ट का उपयोग करें कि यदि ऐसा है, तो अन्यथा एक त्रुटि प्रिंट करें।
execve
)। तर्क स्ट्रिंग शाब्दिक हैं, कोई ग्लोबिंग नहीं, कोई रेगीक्स नहीं। बस। भले ही पहला arg "/ bin / bash" हो और दूसरा विकल्प ("-c ...") उन विकल्पों को शेल द्वारा पार्स नहीं किया जाता है। उन्हें बैश निष्पादन योग्य नहीं सौंपा गया है, यही वजह है कि आपको वे त्रुटियां मिलती हैं। इसके अलावा, शेबंग केवल तभी काम करता है जब यह शुरुआत में हो। तो आप यहाँ भाग्य से बाहर हैं, मुझे डर है (एक स्क्रिप्ट की कमी जो एक अजगर दुभाषिया को ढूंढती है और इसे एक एचआरओ डॉक्टर को खिलाती है, जो एक भयानक गड़बड़ लगता है)।
import sys; sys.version_info()
जांचने के लिए उपयोग कर सकते हैं कि उपयोगकर्ता के पास आवश्यक अजगर संस्करण है या नहीं।