我有一个Heroku项目,该项目使用环境变量来获取其配置,但是我首先使用virtualenv在本地测试我的应用程序。
有没有办法在virtualenv内部设置在远程计算机上定义的环境变量?
我有一个Heroku项目,该项目使用环境变量来获取其配置,但是我首先使用virtualenv在本地测试我的应用程序。
有没有办法在virtualenv内部设置在远程计算机上定义的环境变量?
Answers:
.env
,至少从我的经验来看,似乎文件造就了Heroku。因此,请勿将其包含在您的仓库中。长期的用户/ autoenv btw的忠实拥护者。嗨,肯尼斯,你这家伙!
如果您使用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
。
您可以尝试:
export ENVVAR=value
在virtualenv_root / bin / activate中。基本上,激活脚本是您开始使用virtualenv时执行的脚本,因此您可以在其中放置所有自定义内容。
deactivate
定义的函数virtualenv_root / bin / activate中添加“ unset ENVVAR” 以平衡设置和取消设置
仅使用virtualenv(不使用virtualenvwrapper),通过activate
您采购的用于激活virtualenv 的脚本即可轻松设置环境变量。
跑:
nano YOUR_ENV/bin/activate
将环境变量添加到文件末尾,如下所示:
export KEY=VALUE
如果需要,您还可以设置类似的钩子来取消设置环境变量,如Danilo Bargen在上面的出色答案中所建议的那样。
cd
只是为了有环境变量?颤抖
尽管这里有很多不错的答案,但我没有看到一个发布的解决方案,该解决方案既包括在停用时取消设置环境变量,又不需要除之外的其他库virtualenv
,因此这是我的解决方案,仅涉及使用/ bin / activate进行编辑。变量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 时留下变量。
另一种为django设计的方法,但应该在大多数设置中都可以使用,那就是使用django-dotenv。
要在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