virtualenv में एक पर्यावरण चर सेट करना


160

मेरे पास एक हेरोकू प्रोजेक्ट है जो अपने कॉन्फ़िगरेशन को प्राप्त करने के लिए पर्यावरण चर का उपयोग करता है, लेकिन मैं अपने ऐप का स्थानीय रूप से परीक्षण करने के लिए virtualenv का उपयोग करता हूं।

क्या virtualenv के अंदर रिमोट मशीन पर परिभाषित पर्यावरण चर को सेट करने का एक तरीका है?

जवाबों:


106

अपडेट करें

१v मई २०१ the तक ऑटोएनवी के आरईएडीएमई का कहना है कि डेरेनव शायद बेहतर विकल्प है और इसका मतलब है कि ऑटोएनवी का रखरखाव अब नहीं होता है।

पुराना उत्तर

मैंने ऐसा करने के लिए ऑटोएनवी लिखा:

https://github.com/kennethreitz/autoenv


12
बहुत मज़ेदार gif: D
chachan

3
बस FYI करना ऐसा लगता है कि .envफ़ाइलें बोर्क हरोकू बनाता है, कम से कम मेरे अनुभव में। इसलिए इसे अपने रेपो में शामिल न करें। Autoenv btw के लंबे समय से उपयोगकर्ता / विशाल प्रशंसक। हाय केनेथ, तुम दा आदमी!
गैलेंट्रान

क्या यह उत्तर संपादित होने के बाद भी प्रासंगिक है? नागासाकी 45
फ्रीज किया गया

288

यदि आप virtualenvwrapper का उपयोग कर रहे हैं (मैं अत्यधिक ऐसा करने की सलाह देता हूं), तो आप एक ही नाम के साथ स्क्रिप्ट का उपयोग करके अलग-अलग हुक को परिभाषित कर सकते हैं $VIRTUAL_ENV/bin/। आपको पोस्टएक्टिनेट हुक की आवश्यकता है।

$ workon myvenv

$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
export DJANGO_DEBUG=True
export S3_KEY=mykey
export S3_SECRET=mysecret

$ echo $DJANGO_DEBUG
True

यदि आप इस कॉन्फ़िगरेशन को अपने प्रोजेक्ट डायरेक्टरी में रखना चाहते हैं, तो बस अपने प्रोजेक्ट डायरेक्टरी से एक सिमिलिंक बनाएं $VIRTUAL_ENV/bin/postactivate

$ rm $VIRTUAL_ENV/bin/postactivate
$ ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate

हर बार जब आप mkvirtualenv का उपयोग करते हैं तो आप हर बार सिम्लिंक्स के निर्माण को स्वचालित कर सकते हैं ।

निष्क्रिय करने पर सफाई

याद रखें कि यह अभ्यस्त अपने आप को साफ करता है। जब आप virtualenv को निष्क्रिय करते हैं, तो वातावरण चर बना रहेगा। सममित रूप से साफ करने के लिए आप इसमें जोड़ सकते हैं $VIRTUAL_ENV/bin/predeactivate

$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
unset DJANGO_DEBUG

$ deactivate

$ echo $DJANGO_DEBUG

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

सेट अप:

$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
if [[ -n $SOME_VAR ]]
then
    export SOME_VAR_BACKUP=$SOME_VAR
fi
export SOME_VAR=apple

$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
if [[ -n $SOME_VAR_BACKUP ]]
then
    export SOME_VAR=$SOME_VAR_BACKUP
    unset SOME_VAR_BACKUP
else
    unset SOME_VAR
fi

परीक्षा:

$ echo $SOME_VAR
banana

$ workon myenv

$ echo $SOME_VAR
apple

$ deactivate

$ echo $SOME_VAR
banana

बस एक सटीक: कर ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivateमेरे लिए काम नहीं किया। lnएक पूर्ण मार्ग चाहता है, इसलिए मुझे करना थाln -s `pwd`/.env/postactivate $VIRTUAL_ENV/bin/postactivate
ज़ोनूर

@ ज़ोनूर आप किस ओएस पर हैं? लिनक्स के तहत रिश्तेदार पथ के लिए काम करते हैं ln
डेनिलो बार्गेन

@DaniloBargen मैं LinuxMint 3.2.0 का उपयोग करता हूं। इस उत्तर में कहा गया है कि lnपूर्ण पथ को पसंद करता है इसलिए मैंने कोशिश की और यह काम किया। जब मैंने catयह कहा कि रिश्तेदार पथ के साथ सहानुभूति की कोशिश की No such file or directory
जोनूर

@dpwrussel, कि लगभग इसे समीक्षा के माध्यम से नहीं बनाया, इसका अच्छा जोड़ है, लेकिन इसका इतना महत्वपूर्ण इसे अपने स्वयं के पद के रूप में बनाया जा सकता है (जो आपको कुछ प्रतिनिधि मिलेगा)। बहुत अच्छे जवाब अच्छे हैं :)
केंट फ्रेड्रिक

2
और स्रोत नियंत्रण? यह अन्य लोगों को क्लोनिंग और एक परियोजना को स्थापित करने के लिए कैसे अनुवाद करता है जिसे एनवी की आवश्यकता होती है VAR.S?
CpILL

44

तुम कोशिश कर सकते हो:

export ENVVAR=value

in virtualenv_root / bin / सक्रिय करें। मूल रूप से सक्रिय स्क्रिप्ट को निष्पादित किया जाता है जब आप virtualenv का उपयोग करना शुरू करते हैं ताकि आप अपने सभी अनुकूलन को वहां डाल सकें।


2
यकीन नहीं है कि अगर यह पर्याप्त साफ है, लेकिन निश्चित रूप से काम करता है!
22

2
हाँ, यह सस्ता और बुरा है, लेकिन कभी-कभी आपको यही चाहिए।
माइकल शेपर

1
मैं इसकी अनुशंसा नहीं करता, मैंने इसे किया और कुछ समय बाद सभी सक्रिय स्क्रिप्ट (सक्रिय, सक्रिय सीसी, सक्रिय.फिश) को स्वचालित रूप से अधिलेखित कर दिया गया, इसलिए मैंने अपना परिवर्तन खो दिया। पोस्टएक्टिवेट और प्रीएक्टिवेट का उपयोग करें।
11:93

रिक्त स्थान का उपयोग न करें =
Rik Schoonbeek

deactivateफ़ंक्शन में 'unset ENVVAR' को भी जोड़ सकते हैं, virtualenv_root / bin / को परिभाषित करने के लिए सेटिंग और परेशान करने के लिए सक्रिय करें
लो ज़ेल

42

केवल virtualenv (virtualenvwrapper के बिना ) का उपयोग करके , वर्चुअलाइजेशनactivate को सक्रिय करने के लिए आपके द्वारा सोर्स की जाने वाली स्क्रिप्ट के माध्यम से पर्यावरण चर को सेट करना आसान है ।

Daud:

nano YOUR_ENV/bin/activate

इस तरह फ़ाइल के अंत में पर्यावरण चर जोड़ें:

export KEY=VALUE

यदि आप की जरूरत है तो ऊपर अपने महान जवाब में Danilo Bargen द्वारा सुझाए गए पर्यावरण चर को परेशान करने के लिए आप एक समान हुक भी सेट कर सकते हैं।


9
बहुत अधिक समझदार दृष्टिकोण IMO। cdकेवल पर्यावरण चर होने के लिए ओवरराइडिंग ? कंपकंपी
मिशेल म्यूलर

कैसे निष्क्रिय के बाद सफाई के बारे में?
बन्सिस

36

जबकि यहाँ बहुत सारे अच्छे उत्तर हैं, मैंने एक समाधान पोस्ट नहीं किया है जिसमें दोनों को निष्क्रिय करने पर परेशान करने वाले पर्यावरण चर शामिल हैं और इसके अतिरिक्त अतिरिक्त पुस्तकालयों की आवश्यकता नहीं है virtualenv, इसलिए यहां मेरा समाधान है जिसमें सिर्फ संपादन / बिन / सक्रिय करना शामिल है, का उपयोग करना चर MY_SERVER_NAMEऔर MY_DATABASE_URLउदाहरण के रूप में:

सक्रिय स्क्रिप्ट में निष्क्रिय करने के लिए एक परिभाषा होनी चाहिए, और आप इसके अंत में अपने चर को खोलना चाहते हैं:

deactivate () {
    ...

    # Unset My Server's variables
    unset MY_SERVER_NAME
    unset MY_DATABASE_URL
}

फिर सक्रिय स्क्रिप्ट के अंत में, चर सेट करें:

# Set My Server's variables
export MY_SERVER_NAME="<domain for My Server>"
export MY_DATABASE_URL="<url for database>"

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


3
मुझे यह दृष्टिकोण पसंद है क्योंकि मुझे बाहरी देयताएं या एप्लिकेशन नहीं चाहिए लेकिन इसके साथ समस्या यह है कि यदि आप पर्यावरण का पुनर्निर्माण करते हैं तो आप अपनी सभी सेटिंग्स को ढीला कर देंगे।
VStoykov

2
इस दृष्टिकोण का लाभ सेटअप की गति और जादू की कमी है। स्रोत नियंत्रण से बाहर environ चर रखने हमेशा वातावरण के पुनर्निर्माण जब संभावित रूप से अपने रहस्यों / सेटिंग्स को नष्ट करने की समस्या के लिए आप का नेतृत्व करेंगे।
एंथनी मैनिंग-फ्रैंकलिन

क्या virtualenv निर्देशिका अंत में इस काम के लिए भंडार में जाँच की जा रही है? क्या होगा अगर चर रहस्य है कि आप रेपो में नहीं चाहते हैं? आप इसे कैसे संभालेंगे?
फ्रैक्चर

2
मैं वास्तव में नहीं देखता कि आपकी रिपॉजिटरी में वर्चुअन को शामिल करना एक अच्छा विचार क्यों होगा, क्योंकि वे बहुत पोर्टेबल नहीं हैं, लेकिन मुझे लगता है कि आप अपने निर्यात को सक्रिय स्क्रिप्ट के बजाय एक अलग फ़ाइल में रख सकते हैं और फ़ाइल को स्रोत कर सकते हैं यदि यह मौजूद है, और उस फ़ाइल को अपने भंडार में न जोड़ें।
TheLetterN

18

एक virtualenv के भीतर स्थानीय रूप से दो तरीके हैं जो आप इस का परीक्षण करने के लिए उपयोग कर सकते हैं। पहला एक टूल है जो Heroku toolbelt (https://toolbelt.heroku.com/) के माध्यम से इंस्टॉल किया गया है। उपकरण फोरमैन है। यह आपके सभी पर्यावरण चर का निर्यात करेगा जो स्थानीय रूप से .env फ़ाइल में संग्रहीत होते हैं और फिर आपके Procfile के भीतर ऐप प्रक्रियाएँ चलाते हैं।

दूसरा तरीका अगर आप लाइटर अप्रोच की तलाश में हैं। स्थानीय स्तर पर एक .env फाइल है तो चलाएं:

export $(cat .env)

6

या तो Autoenv स्थापित करें

$ pip install autoenv

(या)

$ brew install autoenv

और फिर .envअपने virtualenv प्रोजेक्ट फ़ोल्डर में फ़ाइल बनाएँ

$ echo "source bin/activate" > .env

अब सब कुछ ठीक है।


3

यदि आप पहले से ही हेरोकू का उपयोग कर रहे हैं, तो फोरमैन के माध्यम से अपना सर्वर चलाने पर विचार करें । यह एक .envफाइल का समर्थन करता है, जो बस एक पंक्ति की एक सूची है जिसके साथ KEY=VALआपके ऐप को रन करने से पहले इसे निर्यात किया जाएगा।


3

इसे करने का एक और तरीका है जो django के लिए डिज़ाइन किया गया है, लेकिन अधिकांश सेटिंग्स में काम करना चाहिए, django-dotenv का उपयोग करना है।

  • मूल - https://github.com/jacobian/django-dotenv
  • अधिक पूरी तरह से चित्रित किया गया कांटा- https://github.com/tedtieken/django-dotenv-rw (मैंने अपने स्थानीय कमांड लाइन से वेबफिकेशन पर अपने रिमोट .env सेटिंग्स को सेट करने में सक्षम होने के लिए यह लिखा था, हरकु ने मुझे खराब कर दिया)

1

envवर्चुअलाइजेन को सक्रिय करने के लिए डायरेक्टरी और एक्सपोर्ट एन्विनमेंट वैरिएबल का .envउपयोग करने के लिए संग्रहित करें:

source env/bin/activate && set -a; source .env; set +a

के साथ एलियंस को बचाने के लिएecho 'alias e=". env/bin/activate && set -a; source .env; set +a"' >> ~/.bash_aliases
Daniil Mashkin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.