在virtualenv中设置一个环境variables
我有一个使用环境variables来获得它的configuration的Heroku项目,但我使用virtualenv来本地testing我的应用程序。
有没有办法在virtualenv里设置远程机器上定义的环境variables?
更新
截至2017年5月17日,autoenv的自述文件指出, direnv可能是更好的select,意味着autoenv不再维护。
老答案
我写了autoenv来做到这一点:
如果你使用的是virtualenvwrapper (我强烈build议这样做),你可以使用$VIRTUAL_ENV/bin/
的同名脚本定义不同的钩子(preactivate,postactivate,predeactivate,postdeactivate)。 你需要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
如果你想在你的项目目录中保存这个configuration,只需要从你的项目目录创build一个符号链接到$VIRTUAL_ENV/bin/postactivate
。
$ rm $VIRTUAL_ENV/bin/postactivate $ ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate
您甚至可以在每次使用mkvirtualenv时自动创build符号链接 。
在停用时进行清理
请记住,这不会自行清理。 当你禁用virtualenv时,环境variables将会持续。 要对称清理,您可以添加到$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
请记住,如果将这个用于可能已经在您的环境中设置的环境variables,则取消设置将导致它们在离开virtualenv时完全不设置。 所以,如果这是可能的,你可以logging以前的值暂时的地方,然后读取停用。
build立:
$ 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
testing:
$ echo $SOME_VAR banana $ workon myenv $ echo $SOME_VAR apple $ deactivate $ echo $SOME_VAR banana
你可以尝试:
export ENVVAR=value
在virtualenv_root / bin / activate中。 基本上激活脚本是当你开始使用virtualenv时执行的,所以你可以把你所有的定制放在那里。
只使用virtualenv(没有virtualenvwrapper ),通过activate
脚本来设置环境variables很容易,以激活virtualenv。
跑:
nano YOUR_ENV/bin/activate
将环境variables添加到文件末尾,如下所示:
export KEY=VALUE
你也可以设置一个类似的钩子来取消环境variables的设置,如Danilo Bargen在上面的精彩回答中所提出的,如果你需要的话。
在virtualenv中有两种方法可以用来testing这个。 第一个是通过Heroku toolbelt(https://toolbelt.heroku.com/)安装的工具。; 工具是工头。 它会将所有存储在.env文件中的环境variables导出到本地,然后在Procfile中运行应用程序进程。
第二种方法,如果你正在寻找一个更轻的方法是在本地有一个.env文件然后运行:
export $(cat .env)
虽然这里有很多很好的答案,但是我没有看到一个解决scheme,它们都包含取消激活的环境variables,并且不需要超出virtualenv
额外的库,所以这里是我的解决scheme,只需要编辑/ bin / activate,使用作为例子,variablesMY_SERVER_NAME
和MY_DATABASE_URL
:
在激活脚本中应该有一个停用的定义,并且你想在它的结尾取消你的variables的设置:
deactivate () { ... # Unset My Server's variables unset MY_SERVER_NAME unset MY_DATABASE_URL }
然后在激活脚本结束时,设置variables:
# Set My Server's variables export MY_SERVER_NAME="<domain for My Server>" export MY_DATABASE_URL="<url for database>"
这样你就不需要安装任何东西来使它工作,而且当你deactivate
virtualenv的时候,你不会因为这些variables而遗留下来。
通过安装autoenv
$ pip install autoenv
(要么)
$ brew install autoenv
然后在virtualenv项目文件夹中创build.env
文件
$ echo "source bin/activate" > .env
现在一切正常。
另一种做法是为Djangodevise,但应该在大多数设置下工作,就是使用django-dotenv。
- 原始 – https://github.com/jacobian/django-dotenv
- 更全function的叉子 – https://github.com/tedtieken/django-dotenv-rw (我写了这个能够设置我的远程.env设置从我的本地命令行的网页,heroku宠坏了我)
如果您已经在使用Heroku,请考虑通过Foreman运行您的服务器。 它支持一个.env
文件,它只是一个KEY=VAL
的行的列表,它将在运行之前导出到你的应用程序。