2013-04-07 8 views
5

ओएसएक्स पर पाइथन 2.7.3 10.8.2क्यों/usr/bin/env का उपयोग मेरे पायथन आयात को तोड़ता है?

मैं वर्तमान में एक स्क्रिप्ट लिख रहा हूं जो मार्कडाउन मॉड्यूल आयात करता है। मैंने पोर्टेबिलिटी के लिए #!/usr/bin/env python शेबांग का इस्तेमाल किया। जब मैं इसे सीधे खोल में के माध्यम से ./myscript.py arg1

जब मैं एक (प्रवेश) खोल के बाहर से स्क्रिप्ट चलाने AppleScript do shell script "/path/to/myscript.py " & quoted form of arg1 के माध्यम से चलाने के लिए, उदाहरण के लिए स्क्रिप्ट ठीक चलता है, यह

myscript.py", line 8, in <module> 
    import markdown 
ImportError: No module named markdown 

के साथ विफल रहा है कि लगता है यह शेबैंग के साथ एक समस्या हो सकती है, इसलिए मैंने शेबांग को अपने पायथन स्थान #!/usr/local/bin/python में बदल दिया और सुनिश्चित किया कि स्क्रिप्ट ठीक काम करती है।

तो मेरे सवाल का दुगना:

  1. क्यों /usr/bin/env python मेरी आयात को तोड़ने का उपयोग कर रहा है?
  2. /usr/local/bin/python का उपयोग किए बिना मैं इस समस्या से कैसे बच सकता हूं?
+0

मुझे नहीं लगता कि यह गैर-लॉगिन खोल का उपयोग करने के रूप में '/ usr/bin/env python' का उपयोग कर रहा है। मुझे लगता है कि '/ usr/local/bin' ऐसे शैल में 'पथ' पर नहीं है, या कम से कम '/ usr/bin' से पहले नहीं है, जो बताएगा कि बाद में' पायथन 'क्यों चुना जाता है। क्या आप अपनी बैश कॉन्फ़िगरेशन फ़ाइलों में 'पथ' बदल रहे हैं? – millimoose

+0

मैंने छोड़ा एक टिड्बिट यह है कि '#!/Usr/bin/env python' और '#!/Usr/local/bin/python' दोनों टेक्स्ट वर्ंगलर में पूरी तरह से काम कर रहे थे, और टर्मिनल में चलने पर दोनों ने मुझे समान परिणाम दिए। यह केवल ऐप्पलस्क्रिप्ट से इसे बुला रहा था जिसने त्रुटि उत्पन्न की (रॉड्रिगो सही है)। जबकि टेक्स्टवंगलर और टर्मिनल दोनों ने मुझे समान परिणाम दिए, मैं 'डेल शेल स्क्रिप्ट' (इको 'आयात sys'; echo 'print sys.path';)/usr/bin/env python "चलाकर अंतर को देखने में सक्षम था। ऐप्पलस्क्रिप्ट संपादक में। 'शैल स्क्रिप्ट करें' जो पायथन "'और भी आसान होता। – n8henrie

उत्तर

3

#!/usr/bin/env python का अर्थ है "python$PATH पर जाएं जैसे कि यह खोल इसके लिए देख रहे थे, और इसे चलाएं।" इसलिए जब आप अलग-अलग परिणाम प्राप्त करते हैं, तो आप शायद अलग-अलग पायथन का उपयोग कर रहे हैं।

जांचने के लिए, देखें कि /usr/local/bin/python और /usr/bin/env python चल रहे हैं तो आपको एक ही पायथन दें। पर प्रत्येक python को खोजने के लिए आप type -a python का भी उपयोग कर सकते हैं। अपने सिस्टम पर, type -a python देता है:

python is /opt/local/bin/python 
python is /usr/bin/python 
python is /usr/local/bin/python 

(यही कारण है कि पहले एक MacPorts द्वारा स्थापित किया गया है।)

वैसे भी, के रूप में रॉड्रिगो बताते हैं, प्रत्यक्ष शुभारंभ शायद $PATH आप उम्मीद का उपयोग नहीं कर रहा है। जिसका अर्थ है /usr/bin/env काम नहीं करेगा।

+0

आपका उत्तर समस्या की प्रकृति को बताता है, लेकिन इसे हल करने का तरीका नहीं है। –

+1

सबसे आसान समाधान '#!/Usr/local/bin/python' का उपयोग करना है या अपनी ऐप्पलस्क्रिप्ट को 'शैल स्क्रिप्ट'/usr/local/bin/python /path/to/myscript.py" और उद्धृत रूप में बदलना है arg1'। –

+0

मैं जानकारी की सराहना करता हूं। मेरे भ्रम में दो अन्य कारकों ने योगदान दिया: एक यह है कि दोनों/usr/local/bin/python और/usr/bin/env python मुझे समान परिणाम देने के लिए प्रकट होते हैं - मुझे लगता है कि ऐसा इसलिए है क्योंकि मैं से कमांड चला रहा हूं एक लॉगिन खोल या तो रास्ता। यह भी हो सकता है क्योंकि मेरे पास दोनों स्थानों पर पाइथन के समान संस्करण स्थापित हैं, क्योंकि उन आदेशों को चलाने से मुझे पायथन, केवल संस्करण संख्या का मार्ग नहीं मिलता है। – n8henrie

1

ठीक है, ऐसा लगता है कि आपके लॉगिन खोल में पाथ पर्यावरण परिवर्तक ऐप्पलस्क्रिप्ट प्रक्रिया से अलग है।

PATH=/usr/local/bin:$PATH 

लेकिन अगर आप अन्य प्रक्रियाओं से नहीं एक खोल खोलते हैं, तो उस फ़ाइल केवल निष्पादित होने

मेरा अनुमान है कि आप एक .profile फ़ाइल या इसी तरह की लाइन के साथ होता है। और जाहिर है कि आपके पास /usr/bin/python में पायथन का एक अलग संस्करण है जिसमें मार्कडाउन मॉड्यूल नहीं है।

+0

आपका उत्तर समस्या की प्रकृति को बताता है, लेकिन इसे हल करने का तरीका नहीं है। –

+0

@ जोश कैसवेल: आप सही हैं। सबसे अच्छा समाधान पाथ सिस्टम को चौड़ा, या कम से कम उपयोगकर्ता चौड़ा बदलना होगा, ताकि सभी उपयोगकर्ता प्रक्रियाओं में एक ही खोज पथ हो। लेकिन मुझे डर है कि विवरण सिस्टम विशिष्ट हैं, और ओपी ने यह नहीं कहा कि वह क्या उपयोग करता है (सेब के बारे में कुछ, शायद)। स्पष्टीकरण के लिए – rodrigo

+1

बहुत धन्यवाद। जैसा कि पोस्ट की शुरुआत में बताया गया है, मैं ओएसएक्स 10.8.2 का उपयोग कर रहा हूं। मैं गैर-लॉगिन गोले के लिए अपना रास्ता बदलने के लिए एक शॉट दे सकता हूं। – n8henrie

संबंधित मुद्दे