2012-08-15 13 views
21

मेरे पास एक स्क्रिप्ट है जिसे मैं वैश्विक रूप से उपलब्ध करना चाहता हूं। मैं मानक hashbang के साथ शुरू कर दिया है:अंदर वर्चुअलनेव बिन से पाइथन स्क्रिप्ट चल रहा है

#! /usr/bin/env python 

और यह मेरी virtualenv की बिन निर्देशिका में लिंक:

~/environments/project/env/bin/myscript 

और मेरे रास्ते पर है कि निर्देशिका गयी। जब मैं कमांड चलाता हूं:

myscript 

मुझे पुस्तकालयों में से एक के साथ आयात त्रुटि मिलती है। हालांकि, अगर मैं वर्चुअल वातावरण को सक्रिय करता हूं और स्क्रिप्ट चलाता हूं, तो यह अपेक्षा के अनुसार काम करता है।

मैंने सिम्लिंक के साथ एक समस्या से इंकार कर दिया है (मैंने बस बिन फ़ोल्डर के अंदर स्क्रिप्ट को स्थानांतरित करने का भी प्रयास किया है)। मैं भी अजगर के साथ स्क्रिप्ट चलाने

python ~/environments/project/env/bin/myscript 

इससे पहले मैं एक स्क्रिप्ट है कि पर्यावरण सक्रिय और फिर मेरी स्क्रिप्ट चलाने पर उपयोग कर रहा था की कोशिश की है, लेकिन मैं यह धारणा थी कि स्क्रिप्ट इस फ़ोल्डर से चलाने virtualenv के साथ चलाना चाहिए व्याख्याता और साइट संकुल। कोई विचार नहीं है कि यह क्यों काम नहीं कर रहा है या कुछ तरीकों से मैं इसे डीबग कर सकता हूं?

+1

आपके प्रश्न से संबंधित नहीं: भले ही अधिकांश गोले इसे अनदेखा करते हैं, '#!/'सख्ती से गलत बोल रहा है, क्योंकि अंतरिक्ष को कार्यक्रम के पथ का हिस्सा माना जाना था। अंतरिक्ष ड्रॉप करें और आप सुरक्षित हैं। – kay

उत्तर

35

स्क्रिप्ट को अपने वर्चुअलएन्व के बिन में डालकर, और उसके बाद उस वैश्विक स्थान पर उस बिन स्थान को जोड़ना आपके वर्चुअलएव को स्वचालित रूप से स्रोत नहीं करेगा। इसे सक्रिय करने के लिए आपको इसे पहले स्रोत करने की आवश्यकता है।

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

हालांकि, आप अपने virtualenv अजगर को वह-बैंग लाइन, जिस स्थिति में साइट-संकुल पथ पर खत्म हो जाएगा हार्डकोड सकता है:

#!/Users/foo/environments/project/env/bin/python 

या किसी अन्य विकल्प के लिए बस एक छोटे से बनाने के लिए है बैश आवरण है कि अपने मूल अजगर स्क्रिप्ट है, जो आप एक सामान्य वह-धमाके के साथ अपने मूल स्क्रिप्ट को छोड़ने के लिए अनुमति देगा कॉल ..

तो अगर myscript.py है: #!/usr/bin/env python ...

तो फिर तुम एक बना सकते हैं myscript:

#!/bin/bash 

/Users/foo/environments/project/env/bin/python myscript.py 

जब आप myscript करते हैं, यह स्पष्ट रूप से अपने अजगर स्क्रिप्ट दुभाषिया आप की स्थापना के साथ कॉल करेंगे।

+0

धन्यवाद मेरी मूल लिपि क्या है। मुझे कुछ ऐसा देखने की याद आ रही थी जिसे मैंने सोचा था कि फ़ोल्डर पर्यावरण को सक्रिय करेगा, लेकिन आप प्रतिबिंब पर सही हैं, मुझे लगता है कि यह असंभव होगा। – justin

7

मुझे लगता है कि आप वर्चुअलएव कैसे काम करते हैं इस बारे में भ्रमित हैं।

संक्षेप में, वर्चुअलएन्व आपके शैल पर्यावरण को संशोधित करता है ताकि पाइथन उन मॉड्यूल को ढूंढने के लिए विभिन्न क्षेत्रों में देखेंगे जिन्हें आप आयात करना चाहते हैं। वास्तव में आपके वर्चुअल वातावरण को स्टोर करने के बीच कोई संबंध नहीं है और जहां आप वर्चुअलएन्व में चलने वाली अपनी स्रोत फ़ाइलों को संग्रहीत करते हैं। यदि आप चाहते थे, तो आप अपने वर्चुअलएन्व को ~/वातावरण/my_env नामक निर्देशिका में संग्रहीत कर सकते हैं, और ~/project/my_proj में अपने वर्चुअलएन्व का उपयोग करते समय आप जिस स्रोत को कोड करते हैं।

आप दस्तावेज़ों में what virtulenv does के बारे में अधिक पढ़ सकते हैं।

असल में, केवल एक चीज जो पाइथन को मॉड्यूल ढूंढने के लिए कहती है पूरी तरह से पाइथन (see the docs पर यह कैसे काम करती है) पर आधारित है। वर्चुअलएन्व को सक्रिय करना जिस तरह से पाइथन काम करता है।

आप शेल स्क्रिप्ट को वर्चुअलएन्व को सक्रिय करने के लिए वापस जा सकते हैं, या आप सीधे अपनी स्क्रिप्ट से इसे सक्रिय करने के लिए this recipe का पालन कर सकते हैं।

activate_this = '/path/to/env/bin/activate_this.py' 
execfile(activate_this, dict(__file__=activate_this)) 

आप इस मार्ग चुनते हैं, तो जानकारी डॉक्स को ध्यान में दे रखें:

यह sys.path बदल जाएगा और यहां तक ​​कि sys.prefix बदलने के लिए, लेकिन यह भी यदि आप किसी मौजूदा उपयोग करने की अनुमति दुभाषिया। आपके पर्यावरण में आइटम वैश्विक वस्तुओं से पहले sys.path पर पहले दिखाई देंगे। हालांकि, वैश्विक आइटम हमेशा पहुंच योग्य रहेगा (जैसे कि - सिस्टम-साइट-पैकेज ध्वज पर्यावरण बनाने में उपयोग किया गया था, चाहे वह था या नहीं)। इसके अलावा, यह अन्य वातावरणों के सक्रियण को पूर्ववत नहीं कर सकता है, या मॉड्यूल जो आयात किए गए हैं। उदाहरण के लिए, आपको वेब अनुरोध से पहले वातावरण सक्रिय करने की कोशिश नहीं करनी चाहिए; आपको एक पर्यावरण जितनी जल्दी हो सके सक्रिय करना चाहिए, और उस प्रक्रिया में फिर से ऐसा नहीं करना चाहिए।

0

मुझे एक ही समस्या का सामना करना पड़ा और इस समाधान के साथ आया: https://github.com/jabbalaci/wpython। यह "wpython" नामक एक स्क्रिप्ट है जो आपके कार्यक्रम को आपके venv में स्थानीय पायथन दुभाषिया के साथ कॉल करती है। इस प्रकार "/Users/foo/environments/project/env/bin/python myscript.py" के बजाय "wpython /path/to/myscript.py" लिखने के लिए पर्याप्त है। एक लॉन्चर स्क्रिप्ट इस तरह दिख सकती है:

#!/usr/bin/env bash 

cd /the/directory/where/myscript.py/is/located 
wpython myscript.py 
2

क्या आप इसके बजाय एक सापेक्ष पथ नहीं जोड़ सके? यह मेरे लिए काम किया:

#!./env/bin/python 
0

मामले में आप विंडोज़ का उपयोग कर रहे हैं, तो आप अजगर फ़ाइल के शीर्ष में निम्न पंक्ति शामिल कर सकते हैं।

#! P:\Workspace\pythontut\Scripts python 
संबंधित मुद्दे