在virtualenv中设置环境变量

时间:2012-03-04 10:22:28

标签: python heroku environment-variables virtualenv

我有一个Heroku项目,它使用环境变量来获取其配置,但我使用virtualenv首先在本地测试我的应用程序。

有没有办法在virtualenv中设置远程机器上定义的环境变量?

11 个答案:

答案 0 :(得分:280)

如果您正在使用virtualenvwrapper(我强烈建议您这样做),您可以使用$VIRTUAL_ENV/bin/中具有相同名称的脚本定义不同的挂钩(preactivate,postactivate,predeactivate,postdeactivate)。你需要postactivate hook。

$ 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 时,您甚至可以automate the creation of the symlinks

停用时清理

请记住,这不会自行清理。停用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

答案 1 :(得分:97)

更新

截至2017年5月17日,autoenv的README声明direnv可能是更好的选择,并且暗示不再维护autoenv。

旧答案

我写了autoenv来做到这一点:

https://github.com/kennethreitz/autoenv

答案 2 :(得分:35)

你可以尝试:

export ENVVAR=value

在virtualenv_root / bin / activate中。 基本上,激活脚本是您开始使用virtualenv时执行的操作,因此您可以将所有自定义放在那里。

答案 3 :(得分:31)

仅使用virtualenv(不含virtualenvwrapper),通过您采购的activate脚本轻松设置环境变量,以激活virtualenv。

执行命令

nano YOUR_ENV/bin/activate

将环境变量添加到文件末尾,如下所示:

export KEY=VALUE

如果需要,你也可以设置一个类似的钩子来解开环境变量,如Danilo Bargen在上面的答案中所建议的那样。

答案 4 :(得分:25)

虽然这里有很多不错的答案,但我没有看到发布的解决方案,其中包括取消激活时未设置的环境变量,并且不需要virtualenv以外的其他库,所以这里&# 39;我的解决方案只涉及编辑/ bin / activate,使用变量MY_SERVER_NAMEMY_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时,您不会留下遗留的变量。

答案 5 :(得分:17)

在virtualenv中,您可以使用两种方法来测试它。第一个是通过Heroku工具带(https://toolbelt.heroku.com/)安装的工具。该工具是领班。它将导出本地存储在.env文件中的所有环境变量,然后在Procfile中运行app进程。

如果您正在寻找更轻的方法,第二种方法是在本地使用.env文件然后运行:

export $(cat .env)

答案 6 :(得分:7)

通过

安装autoenv
$ pip install autoenv

(或)

$ brew install autoenv

然后在virtualenv项目文件夹中创建.env文件

$ echo "source bin/activate" > .env

现在一切正常。

答案 7 :(得分:4)

另一种为django设计的方法,但是应该在大多数设置中使用,就是使用django-dotenv。

答案 8 :(得分:4)

要在env目录中激活virtualenv并导出存储在.env中的环境变量,请使用:

source env/bin/activate && set -a; source .env; set +a

答案 9 :(得分:3)

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

答案 10 :(得分:0)

另一种方法是使用内部运行venv的bash shell进行分叉。运行包含以下内容的可执行文件:

# my_env.sh
export MY_VENV=true
bash

放在〜/ .bashrc中:

# .bashrc
if [ "$MY_VENV" = "true" ]; then
    source ~/.pyenv/bin/activate
    export PYTHONPATH=/some/local/libs
    cd /project/path
    PS1='(my_venv:\w)$ '
fi

退出分叉的外壳将还原原始环境,而不必运行停用功能。