2011-09-24 11 views
49

तो, एक बार फिर, मैं एक अच्छा पायथन प्रोग्राम बनाता हूं जो मेरे जीवन को और अधिक आसान बनाता है और बहुत समय बचाता है। संभोग, इसमें वर्चुअलएन्वार्पर का mkvirtualenv फ़ंक्शन के साथ बनाया गया वर्चुअलनव शामिल है। इस परियोजना में कुछ आवश्यक पुस्तकालयों (अनुरोध भी: डी) के साथ एक info.txt फ़ाइल है और प्रोग्राम इन पुस्तकालयों के बिना नहीं चलेगा।वर्चुअलएन्वार्पर फ़ंक्शन शैल स्क्रिप्ट्स में अनुपलब्ध

मैं bin/run-app निष्पादन योग्य खोल स्क्रिप्ट जोड़ने की कोशिश कर रहा हूं जो मेरे पथ (वास्तव में सिम्लिंक) में होगा। अब, इस स्क्रिप्ट के अंदर, मुझे इस प्रोग्राम को चलाने से पहले वर्चुअलएन्व पर स्विच करने की आवश्यकता है। इसलिए मैं

#!/bin/bash 
# cd into the project directory 
workon "$(cat .venv)" 
python main.py 

एक फ़ाइल .venv virtualenv का नाम शामिल है में इस डाल दिया। लेकिन जब मैं इस स्क्रिप्ट को चलाता हूं, तो मुझे workon: command not found त्रुटि मिलती है।

बेशक, मेरे पास वर्चुअलenvwrapper.sh है जो मेरे bashrc में सोर्स किया गया है लेकिन यह इस शेल स्क्रिप्ट में उपलब्ध नहीं प्रतीत होता है।

तो, मैं उन वर्चुअलवेव्रैपर फ़ंक्शंस को यहां कैसे एक्सेस कर सकता हूं? या मैं यह गलत तरीका कर रहा हूँ? आप अपने अजगर उपकरण कैसे लॉन्च करते हैं, जिनमें से प्रत्येक का अपना वर्चुअलनव है !?

उत्तर

57

बस में virtualenvwrapper.sh स्क्रिप्ट स्रोत वर्चुअलenvwrapper के कार्यों को आयात करने के लिए अपनी स्क्रिप्ट। इसके बाद आपको अपनी स्क्रिप्ट में workon फ़ंक्शन का उपयोग करने में सक्षम होना चाहिए।

और शायद बेहतर है, आप एक खोल स्क्रिप्ट बना सकते हैं एक दिया virtualenv में किसी भी अजगर स्क्रिप्ट चलाने के लिए (यदि आप इसे उदाहरण के लिए venv-run.sh नाम दे सकते हैं), और /usr/bin, /usr/local/bin, या किसी भी निर्देशिका जो अपने PATH में है में रखें।

इस तरह की एक स्क्रिप्ट ऐसा दिखाई दे सकता:

#!/bin/sh 
# if virtualenvwrapper.sh is in your PATH (i.e. installed with pip) 
source `which virtualenvwrapper.sh` 
#source /path/to/virtualenvwrapper.sh # if it's not in your PATH 
workon $1 
python $2 
deactivate 

और venv-run.sh my_virtualenv /path/to/script.py

+2

इसके लिए वर्चुअलenvwrapper.sh स्क्रिप्ट्स का स्थान हार्ड-कोडिंग की आवश्यकता है, जो ओएस पर निर्भर है और बहुत सी चीज़े। –

+0

@ShrikantSharat अच्छी तरह से, क्योंकि यह वर्चुअलनव में स्क्रिप्ट चलाने के लिए एक आसान तरीका है (इसलिए केवल आपके सिस्टम पर), यह वास्तव में कोई समस्या नहीं होनी चाहिए, है ना? यदि आप अपना कोड वितरित करना चाहते हैं, तो मुझे संदेह है कि आप उपयोगकर्ताओं को वर्चुअलएन्व स्थापित करने और एक बनाने के लिए कहेंगे, आप बस उन्हें स्थापित करने के लिए निर्भरताओं की एक सूची देंगे। – MatToufoutu

+0

* उपयोगकर्ता * मेरे तकनीकी मित्र होंगे जो इस कार्यक्रम की निर्भरताओं के लिए वर्चुअलएन्व भी चाहते हैं। मुझे उनसे पूछने की ज़रूरत नहीं है;) –

0

यदि आपकी पायथन स्क्रिप्ट को एक विशेष वर्चुअलएन्व की आवश्यकता है तो वर्चुअलएन्ग की bin निर्देशिका में इसे इंस्टॉल/इंस्टॉल करें। यदि आपको पर्यावरण के बाहर उस स्क्रिप्ट तक पहुंच की आवश्यकता है तो आप एक सिम्लिंक बना सकते हैं। virtualenv के bin से

main.py:

अपने पथ में
#!/path/to/virtualenv/bin/python 
import yourmodule 

if __name__=="__main__": 
    yourmodule.main() 

सिमलिंक:

pymain -> /path/to/virtualenv/bin/main.py 

bin/रन ऐप्लिकेशन में:

#!/bin/sh 
# cd into the project directory 
pymain arg1 arg2 ... 
+0

यह काम करता है में रखें, लेकिन मैं # में virtualenv के अजगर के लिए पथ डाल पसंद नहीं है! रेखा, थोड़ा गंदे लगता है। इसके अलावा, virtual.pyv के अंदर main.py * अंदर * बनाने का यह अतिरिक्त चरण इसे कम पोर्टेबल बनाता है। मेरे दोस्त सिर्फ क्लोन नहीं कर सकते हैं और इसे मुझसे चला सकते हैं :) –

+0

@Shrikant शरत: यदि आप सरल setup.py लिखते हैं तो 'पाइप इंस्टॉल' आपके लिए शेबैंग और वर्चुअलनव/बिन की प्रतिलिपि बनाता है। आपके दोस्त बस: 'पाइप स्थापित गिट + ...' अगर वे खून बह रहा है पसंद है। इस मामले में नोट 'main.py' को * उनके * वर्चुअलएन्व में कॉपी किया गया है और शेबैंग * उनके * वर्चुअलएन्व/पायथन को इंगित करने के लिए लिखा गया है। – jfs

+0

@ सेबेस्टियन, कभी भी उस विकल्प को नहीं माना जाता लेकिन यह अच्छा लगता है। कोई भी अच्छा दस्तावेज़ जो आप अनुशंसा करते हैं (पाइथन दस्तावेज़ों के अलावा जो मैं अभी देख रहा हूं), यदि कोई हो, तो पढ़ रहा है। धन्यवाद! –

0

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

(cdvirtualenv && pwd) > .venv 

और bin/run-app में, मैं

source "$(cat .venv)/bin/activate" 
python main.py 

डाल और आहा!

7

मुझे शेल में virtualenvwrapper के आदेशों को ट्रिगर करने का तरीका नहीं मिल रहा है।लेकिन यह चाल मदद कर सकती है: अपने env मान लीजिए। नाम myenv है, तो स्क्रिप्ट की शुरुआत में निम्नलिखित लाइनों डाल:

ENV=myenv 
source $WORKON_HOME/$ENV/bin/activate 
1

अपने .bashrc में ये पंक्तियां जोड़ सकते हैं या .bash_profile

export WORKON_HOME=~/Envs 
source /usr/local/bin/virtualenvwrapper.sh 

और अपने टर्मिनल को फिर से खोलने और कोशिश

0

आप कर सकते हैं वर्चुअलनव के पायथन निष्पादन योग्य को भी कॉल करें। सबसे पहले निष्पादन के लिए पथ पाते हैं:

$ workon myenv 
$ which python 
/path/to/virtualenv/myenv/bin/python 

फिर अपने खोल स्क्रिप्ट से कॉल:

#!/bin/bash 

/path/to/virtualenv/myenv/bin/python myscript.py 
0

यह एक known issue है। समाधान के लिए, आप स्क्रिप्ट एक समारोह की सामग्री के लिए कर सकते हैं और या तो ~/.bashrc या ~/.profile

function run-app() { 
    workon "$(cat .venv)" 
    python main.py 
} 
संबंधित मुद्दे