Mah*_*sam 149 python heroku environment-variables virtualenv
我有一个Heroku项目,它使用环境变量来获取其配置,但我使用virtualenv首先在本地测试我的应用程序.
有没有办法在virtualenv中设置远程机器上定义的环境变量?
Dan*_*gen 285
如果您正在使用virtualenvwrapper(我强烈建议这样做),您可以使用具有相同名称的脚本定义不同的挂钩(preactivate,postactivate,predeactivate,postdeactivate)$VIRTUAL_ENV/bin/.你需要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
Run Code Online (Sandbox Code Playgroud)
如果要将此配置保留在项目目录中,只需从项目目录创建符号链接即可$VIRTUAL_ENV/bin/postactivate.
$ rm $VIRTUAL_ENV/bin/postactivate
$ ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate
Run Code Online (Sandbox Code Playgroud)
每次使用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
Run Code Online (Sandbox Code Playgroud)
请记住,如果将此用于可能已在您的环境中设置的环境变量,则取消设置将导致它们在离开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
Run Code Online (Sandbox Code Playgroud)
测试:
$ echo $SOME_VAR
banana
$ workon myenv
$ echo $SOME_VAR
apple
$ deactivate
$ echo $SOME_VAR
banana
Run Code Online (Sandbox Code Playgroud)
Ken*_*itz 101
截至2017年5月17日,autoenv的README声明direnv可能是更好的选择,并暗示不再维护autoenv.
我写了autoenv来做到这一点:
https://github.com/kennethreitz/autoenv
kgr*_*kgr 40
你可以尝试:
export ENVVAR=value
Run Code Online (Sandbox Code Playgroud)
在virtualenv_root/bin/activate中.基本上,激活脚本是您开始使用virtualenv时执行的操作,因此您可以将所有自定义放在那里.
Nag*_*i45 36
仅使用virtualenv(不使用virtualenvwrapper),通过activate您采购的脚本轻松设置环境变量以激活virtualenv.
跑:
nano YOUR_ENV/bin/activate
Run Code Online (Sandbox Code Playgroud)
将环境变量添加到文件末尾,如下所示:
export KEY=VALUE
Run Code Online (Sandbox Code Playgroud)
如果需要,你也可以设置一个类似的钩子来解开环境变量,如Danilo Bargen在上面的答案中所建议的那样.
The*_*erN 28
虽然这里有很多很好的答案,但我没有看到一个解决方案,它既包括取消激活时未设置的环境变量,也不需要额外的库virtualenv,所以这里的解决方案只涉及编辑/ bin/activate,使用变量MY_SERVER_NAME和MY_DATABASE_URL例子:
激活脚本中应该有停用的定义,并且您希望在其末尾取消设置变量:
deactivate () {
...
# Unset My Server's variables
unset MY_SERVER_NAME
unset MY_DATABASE_URL
}
Run Code Online (Sandbox Code Playgroud)
然后在激活脚本的末尾,设置变量:
# Set My Server's variables
export MY_SERVER_NAME="<domain for My Server>"
export MY_DATABASE_URL="<url for database>"
Run Code Online (Sandbox Code Playgroud)
这样你就不需要安装其他任何东西来使它工作,并且当你deactivate使用virtualenv 时,你最终不会留下变量.
Cra*_*ens 17
在virtualenv中,您可以使用两种方法来测试它.第一个是通过Heroku工具带(https://toolbelt.heroku.com/)安装的工具.该工具是领班.它将导出本地存储在.env文件中的所有环境变量,然后在Procfile中运行app进程.
第二种方法,如果你正在寻找一个更轻的方法是在本地有一个.env文件然后运行:
export $(cat .env)
Run Code Online (Sandbox Code Playgroud)
要在env目录中激活 virtualenv并导出存储在.env使用中的环境变量:
source env/bin/activate && set -a; source .env; set +a
Run Code Online (Sandbox Code Playgroud)
或者只是以下行pyenv:
set -a; source .env; set +a
Run Code Online (Sandbox Code Playgroud)
关于标准venv包,这里有一个解决方案:
解决方案:
python -m venv MY_ENV
Run Code Online (Sandbox Code Playgroud)
activate脚本。vim MY_ENV/bin/activate
Run Code Online (Sandbox Code Playgroud)
deactivate。当您停用虚拟环境时,将执行这些行。他们恢复了之前的值ENV_VARIABLE。
deactivate () {
... # Already existing code
# Restore the previous value of the ENV_VARIABLE on deactivation
# This code is executed when `deactivate` alias is called.
if [ ! "${1:-}" = "nondestructive" ] ; then
if [ -n "${_OLD_ENV_VARIABLE:-}" ] ; then
ENV_VARIABLE="${_OLD_ENV_VARIABLE:-}"
export ENV_VARIABLE
unset _OLD_ENV_VARIABLE
else
unset ENV_VARIABLE
fi
fi
}
Run Code Online (Sandbox Code Playgroud)
"new value of the ENV_VARIABLE".当您激活虚拟环境时,将执行这些行。
# Update or set a ENV_VARIABLE on activation
if [ -n "${ENV_VARIABLE:-}" ] ; then
_OLD_ENV_VARIABLE="${ENV_VARIABLE:-}"
fi
export ENV_VARIABLE="new value of the ENV_VARIABLE"
Run Code Online (Sandbox Code Playgroud)
结果:
设置新环境变量的结果:
:~$ echo $ENV_VARIABLE
:~$
:~$ source MY_ENV/bin/activate
(MY_ENV):~$
(MY_ENV):~$ echo $ENV_VARIABLE
new value of the ENV_VARIABLE
:~$
(MY_ENV):~$ deactivate
:~$
:~$ echo $ENV_VARIABLE
:~$
Run Code Online (Sandbox Code Playgroud)
更新现有环境变量的结果:
:~$ export ENV_VARIABLE = "old value of the ENV_VARIABLE"
:~$
:~$ echo $ENV_VARIABLE
old value of the ENV_VARIABLE
:~$
:~$ source MY_ENV/bin/activate
(MY_ENV):~$
(MY_ENV):~$ echo $ENV_VARIABLE
new value of the ENV_VARIABLE
:~$
(MY_ENV):~$ deactivate
:~$
:~$ echo $ENV_VARIABLE
old value of the ENV_VARIABLE
:~$
Run Code Online (Sandbox Code Playgroud)
安装autoenv或
$ pip install autoenv
Run Code Online (Sandbox Code Playgroud)
(要么)
$ brew install autoenv
Run Code Online (Sandbox Code Playgroud)
然后.env在virtualenv项目文件夹中创建文件
$ echo "source bin/activate" > .env
Run Code Online (Sandbox Code Playgroud)
现在一切正常.
| 归档时间: |
|
| 查看次数: |
114905 次 |
| 最近记录: |