2012-07-03 17 views
8

मैं इस समस्या है:

System A उबंटू चलाता है और अलग अलग चीजें का एक समूह के लिए Python 2.6 की जरूरत है।
मैंने System A
System B पर Python 2.7 पर Python 2.7 स्थापित किया है।
कई अजगर संस्करणों के साथ काम अजगर फ़ाइलें # का उपयोग करना होगा जब/bin/env अजगर

मेरे पास एक पायथन स्क्रिप्ट BLAH है जो #!/bin/env python ऊपर ऊपर बताती है।
आगे नीचे यह एक और स्क्रिप्ट SIGH निष्पादित करता है, जो शीर्ष पर भी कहते हैं: #!/bin/env python

BLAH या तो System A या System B पर चलने की जरूरत है, और यह हमेशा Python 2.7

----
मेरी समाधान का एक हिस्सा अब तक चलाने के लिए की जरूरत है:
एक आवरण स्क्रिप्ट है कि पहले देखने के लिए कोशिश करता है है यदि which python पाइथन को इंगित कर रहा है 2.7
यदि यह ठीक है तो पाइथन के लिए उस पथ के साथ BLAH चलाएं।
अन्य which python2.7 आज़माएं और BLAH चलाने के लिए उस पथ का उपयोग करें, और उस पथ को env PATH पर जोड़ें। इस समाधान के साथ

समस्या है:

System A पर (जो अजगर 2.7 अलग से स्थापित किया गया है)
BLAH कार्यान्वित, यह अजगर 2.7 के साथ आवरण स्क्रिप्ट मैंने लिखा (ठीक अब तक की वजह से चलता है ..)
जब BLAH spawns SIGH, SIGH कुटिया पथ में अजगर को खोजने के लिए उपयोग करता है और फिर इसे मुसीबत में हैं, क्योंकि उस env के PATH में अजगर की तलाश में है और यह पथ में python2.7 की तलाश में किया जाना चाहिए।

क्या इस समस्या को संभालने का कोई साफ तरीका है?

अग्रिम धन्यवाद!

+0

क्या आप आयात कर सकते हैं, फिर ब्लैक से SIGH चलाएं? –

+0

मुझे यकीन नहीं है कि आपको 'जो' से' पथ 'से प्राप्त पथ जोड़ने की आवश्यकता है -' वास्तव में 'केवल' पथ 'में मौजूद पथ खोजेगा। – jedwards

उत्तर

9

आप एक स्क्रिप्ट है कि, एक निश्चित अजगर संस्करण की जरूरत है उदाहरण के लिए 2.7 है, तो मैं

#!/bin/env python2.7 

को पहली पंक्ति को बदल देंगे और फिर यह सुनिश्चित करें कि python2.7 अपने रास्ते पर है (यदि आप जोड़ना पड़े उपयुक्त के रूप में symlinks)। मैंने उपयोग किए गए सभी वितरणों में, ये सिम्लिंक पहले से मौजूद हैं।

(वास्तव में, python आम तौर पर pythonX करने के लिए एक सिमलिंक जो pythonX.Y करने के लिए एक सिमलिंक है या, मेरे मामले में, python -> python2 -> python2.7 है।)

एक पूर्ण पथ हार्ड-कोड के लिए कोई ज़रूरत नहीं है, इस से भिन्न हो सकती हैं distro या बॉक्स में बॉक्स करने के लिए distro।

लेकिन चूंकि python2.7 नामक आपके पथ पर निष्पादन योग्य के लिए कोई अस्पष्टता नहीं होनी चाहिए, तो आपको हार्ड-कोडिंग पथों के बारे में चिंता किए बिना ठीक होना चाहिए।

वैकल्पिक रूप से, पहले स्क्रिप्ट के भीतर से, आप अजगर दुभाषिया सीधे, कह सकते हैं के रूप में:

subprocess.Popen(['pythonX.Y', SCRIPT_NAME]) 

बजाय

subprocess.Popen([SCRIPT_NAME]) 

संपादित जेएफ सेबस्टियन टिप्पणी में नोट के रूप में, आप पहले तर्क में sys.executable का उपयोग कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि दूसरी स्क्रिप्ट पहले के समान दुभाषिया को पास की गई हो। जैसे

subprocess.Popen([sys.executable, SCRIPT_NAME]) 

एक तरफ ध्यान दें के रूप में, कि या उपयोगी नहीं हो सकता है, आप "वर्तमान" पायथन दुभाषिया के संस्करण स्क्रिप्ट के अंदर से

import sys 
print(sys.hexversion) 

उपयोग कर सकते हैं कर सकते हैं जो उपयोगी हो सकता है यह निर्धारित करने के लिए कि सही दुभाषिया चल रहा है या नहीं।

+0

@jedwards कुछ शेबांग काम नहीं कर रहा है, अपाचे में अमान्य पथ त्रुटि प्राप्त कर रहा है – Volatil3

3

मैं क्या करूँगा #!/bin/env को पहले python2.7 पथ पर सीधे बदलें, उदाहरण के लिए: #!/usr/local/bin/python2.7 काम करेगा।

मामले प्रणाली ए और बी python2.7 पथ में अलग-अलग स्थानों (जो अपने मामले प्रतीत हो रहा है) में हैं तो आप हमेशा इस तरह की एक सिमलिंक बना सकते हैं:

ln -s /bin/python2.7 /usr/local/bin/python2.7 

और यह ठीक काम करना चाहिए।

2

वर्चुअलएन्व का उपयोग क्यों नहीं करें? यह आप (अन्य सामग्री के अलावा) किसी भी अजगर संस्करण स्थापित का उपयोग करने की अनुमति देता ...

starenka /tmp % virtualenv test -ppython2.6 
Running virtualenv with interpreter /usr/bin/python2.6 
New python executable in test/bin/python2.6 
Also creating executable in test/bin/python 
Installing setuptools............................done. 
Installing pip...............done. 

starenka /tmp % source test/bin/activate 

(test)starenka /tmp % which python 
/tmp/test/bin/python 

(test)starenka /tmp % python --version 
Python 2.6.8 

(test)starenka /tmp % echo '#!/usr/bin/env python\nimport sys; print sys.version_info' > test/test.py 

(test)starenka /tmp % chmod +x test/test.py 

(test)starenka /tmp % test/test.py 
(2, 6, 8, 'final', 0) 

starenka /tmp % virtualenv test7 -ppython2.7 
Running virtualenv with interpreter /usr/bin/python2.7 
New python executable in test7/bin/python2.7 
Also creating executable in test7/bin/python 
Installing setuptools............done. 
Installing pip...............done. 
starenka /tmp % source test7/bin/activate 

(test7)starenka /tmp % which python 
/tmp/test7/bin/python 

(test7)starenka /tmp % python --version 
Python 2.7.3rc2 

(test7)starenka /tmp % echo '#!/usr/bin/env python\nimport sys; print sys.version_info' > test7/test.py 

(test7)starenka /tmp % chmod +x test7/test.py 

(test7)starenka /tmp % test7/test.py 
sys.version_info(major=2, minor=7, micro=3, releaselevel='candidate', serial=2) 
0

बेवकूफ और सरल

खोल में, यदि आवश्यक हो तो:

ln -s /path/to/your/python2.X /usr/local/bin/python2 

अजगर में स्क्रिप्ट:

#!/bin/bash 
"exec" "python2" "$0" 

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