我有一个Heroku项目,它使用环境变量来获取其配置,但我使用virtualenv首先在本地测试我的应用程序。
有没有办法在virtualenv中设置远程机器上定义的环境变量?
答案 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)
答案 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_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时,您不会留下遗留的变量。
答案 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
退出分叉的外壳将还原原始环境,而不必运行停用功能。