virtualenv에서 환경 변수 설정


160

환경 변수를 사용하여 구성을 얻는 Heroku 프로젝트가 있지만 virtualenv를 사용하여 로컬에서 앱을 먼저 테스트합니다.

virtualenv 내의 원격 시스템에 정의 된 환경 변수를 설정하는 방법이 있습니까?

답변:


106

최신 정보

2017년 5월 17일 기준으로하는 것이 autoenv 상태의 README direnv은 아마 더 나은 옵션이며 autoenv을 의미는 더 이상 유지되지 않습니다.

이전 답변

나는 이것을 정확하게하기 위해 autoenv를 썼다 :

https://github.com/kennethreitz/autoenv


12
Very funny gif : D
chachan

3
참고 .env로 적어도 내 경험에 따르면 파일 bork Heroku가 빌드 하는 것 같습니다 . 리포지토리에 포함시키지 마십시오. autoenv btw의 오랜 사용자 / 거대한 팬. 케네스 안녕, 너!
galarant

이 답변은 편집 후에도 여전히 관련이 있습니까? 제안 솔루션에 대한 당신의 의견은 무엇이다 Nagasaki45TheLetterN
얼어 붙었다

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
Zoneur

@Zoneur 어떤 OS를 사용하고 있습니까? 리눅스에서는 상대 경로가 작동합니다 ln.
Danilo Bargen

@DaniloBargen LinuxMint 3.2.0을 사용합니다. 이 대답ln전체 경로 를 좋아 한다고 말했기 때문에 시도해 보았습니다. cat상대 경로로 심볼릭 링크를 시도했을 때 그것은 말했다 No such file or directory.
Zoneur

@dpwrussel은 리뷰를 통해 거의 얻지 못했지만 좋은 추가 사항이지만 너무 중요하여 자체 게시물로 만들 수 있습니다 (이것은 일부 담당자를 얻었을 것입니다). 좋은 답변을 많이 :) 좋다
켄트 프레드릭

2
그리고 소스 컨트롤? 이것은 환경을 필요로하는 프로젝트를 복제하고 설정하는 다른 사람들에게 어떤 의미가 있습니까? var.s?
CpILL

44

시도해 볼 수 있습니다 :

export ENVVAR=value

virtualenv_root / bin / activate에서. 기본적으로 활성화 스크립트는 virtualenv 사용을 시작할 때 실행되므로 모든 사용자 정의를 거기에 넣을 수 있습니다.


2
그것이 충분히 깨끗하지만 확실하게 작동하는지 확실하지 않습니다!
chachan

2
예, 싸고 불쾌하지만 때로는 그게 필요합니다.
Michael Scheper

1
나는 이것을 권장하지 않으며, 그것을하고 나중에 나중에 모든 활성화 스크립트 (activate, activate.csh, activate.fish)가 자동으로 덮어 쓰여서 변경 사항을 잃었습니다. postactivate 및 predeactivate를 사용하십시오.
wil93


또한 deactivate설정 및 설정 해제의 균형을 유지하기 위해 정의 된 virtualenv_root / bin / activate 함수 에 'unset ENVVAR'을 추가 할 수 있습니다.
Lou Zell

42

virtualenvwrapper없이 virtualenv 만 사용하면 환경 변수를 쉽게 설정할 수 있습니다.activate 를 활성화하기 위해 소싱 스크립트를 .

운영:

nano YOUR_ENV/bin/activate

다음과 같이 파일 끝에 환경 변수를 추가하십시오.

export KEY=VALUE

Danilo Bargen이 제안한대로 위의 큰 대답에서 환경 변수를 설정 해제하기 위해 비슷한 후크를 설정할 수도 있습니다.


9
훨씬 더 제정 된 접근 방식 IMO. cd환경 변수를 갖기 위해 재정의 ? 떨림
Michel Müller

비활성화 후 정리는 어떻습니까?
buncis

36

여기에 좋은 답변이 많이 있지만 둘 다 비활성화에 환경 변수 설정 해제가 포함되어 있고 추가 라이브러리가 필요하지 않은 솔루션이 게시되어 있지 않으므로 virtualenv여기를 사용하여 / bin / activate 편집 만 포함하는 솔루션이 있습니다. 변수 MY_SERVER_NAMEMY_DATABASE_URL예제 :

activate 스크립트에 deactivate에 대한 정의가 있어야하며 그 끝에 변수를 설정 해제하려고합니다.

deactivate () {
    ...

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

그런 다음 activate 스크립트의 끝에서 변수를 설정하십시오.

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

이렇게하면 작동하기 위해 다른 것을 설치할 필요가 없으며 deactivatevirtualenv 에 남아있을 때 변수가 남지 않아도됩니다 .


3
외부 라이브러리 또는 앱을 원하지 않기 때문에이 방법을 좋아하지만 환경을 다시 빌드하면 모든 설정이 느슨해집니다.
VStoykov

2
이 방법의 장점은 설정 속도와 마법 부족입니다. 환경 변수를 소스 제어에서 유지하면 환경을 재 구축 할 때 항상 비밀 / 설정을 파괴 할 수있는 문제가 발생합니다.
Anthony Manning-Franklin

virtualenv 디렉토리가 저장소에 체크인되어 결국 작동합니까? 변수가 리포지토리에서 원하지 않는 비밀을 보유하면 어떻게 될까요? 이것을 어떻게 처리하겠습니까?
fraxture 2012 년

2
실제로 이식성이 좋지 않기 때문에 저장소에 virtualenv를 포함시키는 것이 왜 좋은지 알지 못하지만 활성화 스크립트 대신 별도의 파일에 내보내기를 넣고 파일을 소싱 할 수 있다고 상상합니다. 존재하고 해당 파일을 저장소에 추가하지 마십시오.
TheLetterN

18

virtualenv에는 로컬로이를 테스트하는 데 사용할 수있는 두 가지 방법이 있습니다. 첫 번째는 Heroku toolbelt (https://toolbelt.heroku.com/)를 통해 설치되는 도구입니다. 이 도구는 감독입니다. .env 파일에 저장된 모든 환경 변수를 로컬로 내 보낸 다음 Procfile 내에서 앱 프로세스를 실행합니다.

더 가벼운 접근 방식을 찾고 있다면 두 번째 방법은 .env 파일을 로컬로 만든 다음 다음을 실행하는 것입니다.

export $(cat .env)

6

다음 중 하나를 사용하여 autoenv 를 설치 하십시오.

$ pip install autoenv

(또는)

$ brew install autoenv

그런 다음 .envvirtualenv 프로젝트 폴더에 파일 을 작성 하십시오.

$ echo "source bin/activate" > .env

이제 모든 것이 잘 작동합니다.


3

이미 Heroku를 사용하고 있다면 Foreman을 통해 서버를 실행하십시오 . 그것은 실행하기 전에 앱으로 내 보내질 .env줄 목록 인 파일을 지원 KEY=VAL합니다.



1

env디렉토리 에서 virtualenv를 활성화 하고 .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.