การตั้งค่าตัวแปรสภาพแวดล้อมใน virtualenv


160

ฉันมีโครงการ Heroku ที่ใช้ตัวแปรสภาพแวดล้อมเพื่อรับการกำหนดค่า แต่ฉันใช้ virtualenv เพื่อทดสอบแอปของฉันในเครื่องก่อน

มีวิธีการตั้งค่าตัวแปรสภาพแวดล้อมที่กำหนดไว้ในเครื่องระยะไกลภายใน virtualenv หรือไม่?

คำตอบ:


106

ปรับปรุง

ตั้งแต่วันที่ 17 พฤษภาคม 2017 README ของ autoenv ระบุว่าdirenvน่าจะเป็นตัวเลือกที่ดีกว่าและนัย autoenv ไม่ได้รับการบำรุงรักษาอีกต่อไป

คำตอบเก่า

ฉันเขียน autoenv เพื่อทำสิ่งนี้:

https://github.com/kennethreitz/autoenv


12
gif ตลกมาก: D
chachan

3
เพียงแค่ FYI ดูเหมือนว่า.envไฟล์ที่ Herork สร้างขึ้นอย่างน้อยก็ในประสบการณ์ของฉัน ดังนั้นอย่ารวมไว้ใน repo ของคุณ ผู้ใช้ / แฟนตัวยงของ autoenv btw สวัสดี Kenneth คุณ da man!
galarant

คำตอบนี้ยังคงเกี่ยวข้องหลังจากแก้ไขหรือไม่ เป็นความเห็นของคุณเกี่ยวกับวิธีการแก้ปัญหาโดยสิ่งที่Nagasaki45 & TheLetterN
แช่แข็ง

288

ในกรณีที่คุณกำลังใช้virtualenvwrapper (ผมขอแนะนำให้ทำเช่นนั้น) คุณสามารถกำหนดตะขอที่แตกต่างกัน (preactivate, postactivate, predeactivate, postdeactivate) $VIRTUAL_ENV/bin/โดยใช้สคริปต์ที่มีชื่อเดียวกันใน คุณต้องตะขอ postactivate

$ 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

หากคุณต้องการที่จะให้การกำหนดค่านี้ในไดเรกทอรีโครงการของคุณเพียงแค่สร้าง symlink $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
Zoneur

@Zoneur คุณกำลังทำอะไรอยู่ ภายใต้ Linux lnทางญาติทำงาน
Danilo Bargen

@DaniloBargen ฉันใช้ LinuxMint 3.2.0 คำตอบนี้บอกว่าlnชอบเส้นทางเต็มดังนั้นฉันจึงลองใช้และใช้ได้ เมื่อฉันพยายามที่จะcatsymlink No such file or directoryกับทางญาติก็กล่าวว่า
Zoneur

@dpussussel, ที่เกือบจะไม่ได้ทำมันผ่านการตรวจสอบ, มันเป็นการเพิ่มที่ดี, แต่มันมีความสำคัญมากจนมันสามารถสร้างเป็นโพสต์ของตัวเองได้ (ซึ่งจะทำให้คุณมีตัวแทน) จำนวนมากของคำตอบที่ดีเป็นสิ่งที่ดี :)
เคนท์เฟรดริก

2
และการควบคุมแหล่งที่มา? สิ่งนี้แปลไปยังคนอื่นการโคลนและการตั้งค่าโครงการที่ต้องการ env ได้อย่างไร VAR.S?
CpILL

44

คุณสามารถลอง:

export ENVVAR=value

ใน virtualenv_root / bin / เปิดใช้งาน โดยพื้นฐานแล้วสคริปต์การเปิดใช้งานคือสิ่งที่ถูกดำเนินการเมื่อคุณเริ่มใช้ virtualenv เพื่อให้คุณสามารถกำหนดเองทั้งหมดของคุณได้


2
ไม่แน่ใจว่ามันสะอาดเพียงพอ แต่ใช้งานได้จริง!
chachan

2
ใช่มันราคาถูกและน่ารังเกียจ แต่บางครั้งก็เป็นสิ่งที่คุณต้องการ
Michael Scheper

1
ฉันไม่แนะนำสิ่งนี้ฉันทำและหลังจากนั้นสคริปต์การเปิดใช้งานทั้งหมด (เปิดใช้งาน, enable.csh, activ.fish) จะถูกเขียนทับโดยอัตโนมัติดังนั้นฉันจึงสูญเสียการเปลี่ยนแปลง ใช้การปิดใช้งานและเปิดใช้งานล่วงหน้า
wil93

อย่าใช้ช่องว่างรอบ =
Rik Schoonbeek

ยังสามารถเพิ่ม 'unset ENVVAR' ในdeactivateฟังก์ชั่นที่กำหนด virtualenv_root / bin / เปิดใช้งานเพื่อความสมดุลของการตั้งค่าและ
Lou Zell

42

การใช้ virtualenv เท่านั้น (โดยไม่ต้องvirtualenvwrapper ) การตั้งค่าตัวแปรสภาพแวดล้อมนั้นทำได้ง่ายผ่านactivateสคริปต์ที่คุณจัดหาเพื่อเปิดใช้งาน virtualenv

วิ่ง:

nano YOUR_ENV/bin/activate

เพิ่มตัวแปรสภาพแวดล้อมลงท้ายไฟล์ดังนี้:

export KEY=VALUE

คุณยังสามารถตั้งค่า hook ที่คล้ายกันเพื่อยกเลิกการตั้งค่าตัวแปรสภาพแวดล้อมตามที่ Danilo Bargen แนะนำไว้ในคำตอบที่ดีของเขาด้านบนหากคุณต้องการ


9
IMO ที่มีสติมากกว่านี้ การเอาชนะcdเพียงเพื่อให้มีตัวแปรสภาพแวดล้อม? ตัวสั่น
Michel Müller

วิธีการเกี่ยวกับการล้างหลังจาก deactive?
buncis

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ที่ค้างอยู่เมื่อคุณใช้ virtualenv


3
ฉันชอบวิธีนี้เพราะฉันไม่ต้องการ libs หรือแอพภายนอก แต่ปัญหาที่เกิดขึ้นคือถ้าคุณสร้างสภาพแวดล้อมใหม่คุณจะสูญเสียการตั้งค่าทั้งหมดของคุณ
VStoykov

2
ข้อดีของวิธีนี้คือความเร็วในการตั้งค่าและการขาดเวทมนตร์ การป้องกันตัวแปรสภาพแวดล้อมออกจากการควบคุมซอร์สจะนำคุณกลับไปสู่ปัญหาที่อาจทำลายความลับ / การตั้งค่าของคุณเมื่อสร้างสภาพแวดล้อมขึ้นใหม่
Anthony Manning-Franklin

ไดเรกทอรี virtualenv สิ้นสุดการตรวจสอบในที่เก็บเพื่อให้มันใช้งานได้หรือไม่? เกิดอะไรขึ้นถ้าตัวแปรเก็บความลับที่คุณไม่ต้องการใน repo คุณจะจัดการกับสิ่งนี้อย่างไร
fraxture

2
ฉันไม่เห็นจริง ๆ ว่าทำไมจึงเป็นความคิดที่ดีที่จะรวม virtualenv ในที่เก็บของคุณเนื่องจากมันไม่ได้พกพามาก แต่ฉันคิดว่าคุณสามารถใส่การส่งออกของคุณในไฟล์แยกต่างหากแทนสคริปต์เปิดใช้งานและแหล่งที่มาของไฟล์ถ้า มันมีอยู่และไม่ต้องเพิ่มไฟล์ลงในที่เก็บของคุณ
TheLetterN

18

ภายใน virtualenv มีสองวิธีที่คุณสามารถใช้เพื่อทดสอบนี้ สิ่งแรกคือเครื่องมือที่ติดตั้งผ่าน Heroku toolbelt เครื่องมือนี้เป็นหัวหน้าคนงาน มันจะส่งออกตัวแปรสภาพแวดล้อมทั้งหมดของคุณที่เก็บไว้ในไฟล์. env ในเครื่องจากนั้นเรียกใช้กระบวนการแอปภายใน Procfile ของคุณ

วิธีที่สองหากคุณกำลังมองหาวิธีที่เบากว่าคือการมีไฟล์. env อยู่ภายในเครื่องให้รัน

export $(cat .env)

6

ติดตั้งautoenvโดย

$ pip install autoenv

(หรือ)

$ brew install autoenv

จากนั้นสร้าง.envไฟล์ในโฟลเดอร์โครงการ virtualenv ของคุณ

$ echo "source bin/activate" > .env

ตอนนี้ทุกอย่างทำงานได้ดี


3

หากคุณกำลังใช้ Heroku พิจารณาใช้เซิร์ฟเวอร์ของคุณผ่านทางหัวหน้างาน รองรับ.envไฟล์ซึ่งเป็นเพียงรายการบรรทัดKEY=VALที่จะถูกส่งออกไปยังแอพของคุณก่อนที่จะทำงาน


3

อีกวิธีในการทำที่ออกแบบมาสำหรับ django แต่ควรทำงานในการตั้งค่าส่วนใหญ่คือการใช้ django-dotenv

  • ต้นฉบับ - https://github.com/jacobian/django-dotenv
  • ส้อมเด่นอย่างเต็มที่เพิ่มเติมhttps://github.com/tedtieken/django-dotenv-rw (ฉันเขียนสิ่งนี้เพื่อให้สามารถตั้งค่าการตั้งค่า. env ระยะไกลของฉันบน webfaction จากบรรทัดคำสั่งท้องถิ่นของฉัน heroku ทำให้ฉันเสีย)

1

ในการเปิดใช้งาน virtualenv ใน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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.