在 viralenv 设置一个环境变量

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

有没有一种方法来设置在 Virtual alenv 中的远程机器上定义的环境变量?

226692 次浏览

你可以试试:

export ENVVAR=value

在 viralenv _ root/bin/active 中。 基本上,激活脚本是在您开始使用 viralenv 时执行的,这样您就可以将所有的定制放入其中。

在 Virtual alenv 中,本地有两种方法可以用来测试这一点。第一个是通过 Heroku 工具带( https://toolbelt.Heroku.com/)安装的工具。工具是 Foreman。它将导出存储在。在本地运行 env 文件,然后在 Procfile 中运行应用程序进程。

第二种方法是在本地创建一个. env 文件,然后运行:

export $(cat .env)

更新

自2017年5月17日起,autoenv 的 README 指出,Direnv可能是更好的选择,并暗示 autoenv 不再维护。

旧答案

我写了 autoenv 就是为了做这个:

Https://github.com/kennethreitz/autoenv

如果您正在使用 虚拟包装器(我强烈建议这样做) ,您可以使用 $VIRTUAL_ENV/bin/中具有相同名称的脚本定义不同的钩子(预激活、后激活、预激活、后激活)。你需要后激活钩子。

$ 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

每次使用 (德语)时,您甚至可以使用 自动创建符号链接

清理停用状态

记住,这不会自己清理干净。当你关闭虚拟环境变量时,它会继续存在。为了清理对称,您可以添加到 $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

请记住,如果对可能已经在您的环境中设置的环境变量使用它,则取消设置将导致它们在离开 viralenv 时完全未设置。因此,如果这是在所有的可能性,您可以记录以前的值的地方临时,然后读取回来,在停用。

设置:

$ 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

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

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

只使用 viralenv (不使用 虚拟包装器) ,通过 activate脚本设置环境变量很容易,这样可以激活 viralenv。

在 Unix 上,运行:

nano YOUR_ENV/bin/activate

或者如果你在窗户上:

nano YOUR_ENV/Scripts/activate.bat

然后,将环境变量添加到文件的末尾:

export KEY=VALUE

或者如果你在窗户上:

set KEY=VALUE

你也可以设置一个类似的钩子来取消环境变量,就像 Danilo Bargen 在他上面的精彩回答中建议的那样。

安装 Autoenv

$ pip install autoenv

(或)

$ brew install autoenv

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

$ echo "source bin/activate" > .env

现在一切都好了。

虽然这里有很多不错的答案,但是我没有看到一个解决方案,它既包括取消激活环境变量,也不需要 virtualenv以外的其他库,所以这里是我的解决方案,只涉及编辑/bin/激活,使用变量 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虚拟连接时留下变量。

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

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

或者仅仅是 pyenv的下面一行:

set -a; source .env; set +a

关于标准的 来吧包,这里有一个解决方案:

  • 在激活时设置 更新环境变量。
  • 恢复 停用时环境变量的先前值。

解决方案 :

  1. 创建 MY _ ENV 环境。
python -m venv MY_ENV
  1. 在任何文本编辑器(例如 vim)中打开 activate脚本。
vim MY_ENV/bin/activate
  1. 更新 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


}
  1. 在脚本的末尾添加行,在这里定义 "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"


  1. 保存关闭文件。

结果 :

设定的结果一个新的环境变量:

:~$ 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


:~$




更新已经存在的环境变量:

:~$ 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
:~$