Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在virtualenv中设置环境变量_Python_Heroku_Environment Variables_Virtualenv - Fatal编程技术网

Python 在virtualenv中设置环境变量

Python 在virtualenv中设置环境变量,python,heroku,environment-variables,virtualenv,Python,Heroku,Environment Variables,Virtualenv,我有一个Heroku项目,它使用环境变量进行配置,但我首先使用virtualenv在本地测试我的应用程序 有没有办法在virtualenv内部设置远程计算机上定义的环境变量?您可以尝试: export ENVVAR=value 在virtualenv_root/bin/activate中。 基本上,激活脚本是在您开始使用virtualenv时执行的脚本,因此您可以将所有自定义项都放在其中。在virtualenv中,有两种方法可以用来测试这一点。第一种是通过Heroku工具带安装的工具(http

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

有没有办法在virtualenv内部设置远程计算机上定义的环境变量?

您可以尝试:

export ENVVAR=value
在virtualenv_root/bin/activate中。
基本上,激活脚本是在您开始使用virtualenv时执行的脚本,因此您可以将所有自定义项都放在其中。

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

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

export $(cat .env)
更新 截至2017年5月17日,autoenv自述文件表明,这可能是更好的选择,并暗示autoenv不再维护

旧答案 我编写autoenv就是为了做到这一点:

如果您正在使用(我强烈建议这样做),您可以使用
$VIRTUAL\u 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
$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
unset DJANGO_DEBUG

$ deactivate

$ echo $DJANGO_DEBUG
您甚至可以每次使用mkvirtualenv

清理垃圾 请记住,这不会清理后本身。停用virtualenv时,环境变量将保持不变。要对称清理,可以添加到
$VIRTUAL\u ENV/bin/predeactivate

$ rm $VIRTUAL_ENV/bin/postactivate
$ ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate
$ 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
测试:


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

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

  • 原件-
  • 功能更全面的fork-(我写这篇文章是为了能够从本地命令行在webpartion上设置remote.env设置,heroku宠坏了我)
仅使用virtualenv(无),通过
激活
脚本轻松设置环境变量,以激活virtualenv

运行:

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

export KEY=VALUE
如果需要,您还可以设置类似的钩子来取消设置环境变量,正如Danilo Bargen在上面的伟大回答中所建议的那样。

通过以下两种方式安装

$ pip install autoenv
(或)

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

$ echo "source bin/activate" > .env

现在一切正常。

虽然这里有很多不错的答案,但我没有看到发布的解决方案既包括在停用时取消设置环境变量,也不需要在
virtualenv
之外的其他库,因此我的解决方案只涉及编辑/bin/activate,使用变量
MY_SERVER_NAME
MY_DATABASE_URL
作为示例:

activate脚本中应该有一个deactivate的定义,并且您希望在其末尾取消设置变量:

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>"
#设置我的服务器的变量
导出我的_服务器_NAME=“”
导出我的_数据库_URL=“”

通过这种方式,您无需安装任何其他设备即可使其正常工作,并且当您
停用
virtualenv时,不会留下变量。

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

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

只是为了精确:对我来说,执行
ln-s.env/postactivate$VIRTUAL\u env/bin/postactivate
不起作用
ln
需要完整的路径,所以我必须执行
ln-s`pwd`/.env/postactivate$VIRTUAL\u env/bin/postactivate
@Zoneur你在使用什么操作系统?在Linux下,相对路径用于
ln
@DaniloBargen,我使用LinuxMint 3.2.0。说
ln
喜欢完整路径,所以我尝试了一下,效果不错。当我尝试
cat
带有相对路径的符号链接时,它说
没有这样的文件或目录
@dpwrussel,这几乎没有通过审查,这是一个很好的补充,但它如此重要,它可以作为自己的帖子(这会让你获得一些声誉)。很多好的答案都是好的:)还有源代码控制?这将如何转化为其他人克隆和建立一个需要env的项目。var.s?在我看来,这是一种更明智的方法。为了拥有环境变量而覆盖
cd
?对停用后的清理感到不寒而栗?不确定是否足够干净,但肯定有效!是的,这很便宜,也很讨厌,但有时这正是你所需要的。我不推荐这样做,我做了,后来所有的激活脚本(activate,activate.csh,activate.fish)都被自动覆盖,所以我丢失了我的更改。使用postactivate和predeactivate。不要在=周围使用空格,也可以在
deactivate
函数定义的virtualenv\u root/bin/activate中添加“unset ENVVAR”,以平衡设置和取消设置仅供参考,至少以我的经验来看,
.env
文件是bork Heroku构建的。因此,不要将其包括在回购协议中。autoenv的长期用户/超级粉丝顺便说一句。嗨,肯尼思,你这个男人!这个答案在编辑后仍然相关吗?你的意见是什么
source env/bin/activate && set -a; source .env; set +a