在virtualenv中设置一个环境variables

我有一个使用环境variables来获得它的configuration的Heroku项目,但我使用virtualenv来本地testing我的应用程序。

有没有办法在virtualenv里设置远程机器上定义的环境variables?

更新

截至2017年5月17日,autoenv的自述文件指出, direnv可能是更好的select,意味着autoenv不再维护。

老答案

我写了autoenv来做到这一点:

https://github.com/kennethreitz/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_NAMEMY_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。

如果您已经在使用Heroku,请考虑通过Foreman运行您的服务器。 它支持一个.env文件,它只是一个KEY=VAL的行的列表,它将在运行之前导出到你的应用程序。