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

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

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_NAME와 MY_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.