在virtualenv中设置环境变量


Answers:


106

更新资料

截至2017年5月17日,autoenv的自述文件指出direnv可能是更好的选择,并暗示autoenv将不再维护。

旧答案

我写了autoenv来做到这一点:

https://github.com/kennethreitz/autoenv


12
非常有趣的gif:D
chachan 2014年

3
仅供参考.env,至少从我的经验来看,似乎文件造就了Heroku。因此,请勿将其包含在您的仓库中。长期的用户/ autoenv btw的忠实拥护者。嗨,肯尼斯,你这家伙!
2015年

编辑后此答案仍然有用吗?您对Nagasaki45TheLetterN
冻结

288

如果您使用virtualenvwrapper(我强烈建议您这样做),则可以使用中具有相同名称的脚本定义不同的钩子(预激活,后激活,预停用,后停用)$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

您甚至可以在每次使用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

请记住,如果将其用于可能已在您的环境中设置的环境变量,则取消设置将导致它们在离开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

只是一个精度:这样ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate做对我没有用。ln想要一条完整的道路,所以我不得不做ln -s `pwd`/.env/postactivate $VIRTUAL_ENV/bin/postactivate
Zoneur 2013年

@Zoneur您正在使用什么操作系统?在Linux下,相对路径适用于ln
Danilo Bargen

@DaniloBargen我使用LinuxMint 3.2.0。这个答案说,ln我喜欢完整的路径,所以我尝试了一下,并且奏效了。当我尝试cat使用相对路径进行符号链接时,它说No such file or directory
Zoneur

@dpwrussel,这几乎没有通过审核通过,这是一个很好的补充,但是它是如此重要,可以作为自己的帖子发布(这会带给您一些代表)。很多好的答案都很好:)
肯特·弗雷德里克

2
和源代码控制?这如何转化为其他人克隆和设置需要环境的项目。变种?
CpILL

44

您可以尝试:

export ENVVAR=value

在virtualenv_root / bin / activate中。基本上,激活脚本是您开始使用virtualenv时执行的脚本,因此您可以在其中放置所有自定义内容。


2
不知道这是否足够干净,但绝对可以!
chachan 2014年

2
是的,它既便宜又讨厌,但是有时候这就是您所需要的。
Michael Scheper 2014年

1
我不推荐这样做,我这样做了,过了一段时间,所有激活脚本(activate,activate.csh,activate.fish)都被自动覆盖了,所以我丢失了更改。使用后激活和预激活。
wil93

不要在=周围使用空格
Rik Schoonbeek '19

也可以在deactivate定义的函数virtualenv_root / bin / activate中添加“ unset ENVVAR” 以平衡设置和取消设置
Lou Zell

42

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

跑:

nano YOUR_ENV/bin/activate

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

export KEY=VALUE

如果需要,您还可以设置类似的钩子来取消设置环境变量,如Danilo Bargen在上面的出色答案中所建议的那样。


9
IMO的方法更为理智。压倒一切cd只是为了有环境变量?颤抖
米歇尔·穆勒

停用后如何清理?
Buncis

36

尽管这里有很多不错的答案,但我没有看到一个发布的解决方案,该解决方案既包括在停用时取消设置环境变量,又不需要除之外的其他库virtualenv,因此这是我的解决方案,仅涉及使用/ 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 时留下变量。


3
我喜欢这种方法,因为我不需要外部库或应用程序,但是这样做的问题是,如果您重建环境,则会丢失所有设置。
VStoykov

2
这种方法的优点是设置速度快且缺乏魔力。将环境变量置于源代码控制范围之外,总是会导致您回到重建环境时可能破坏机密/设置的问题。
安东尼·曼宁-富兰克林

是否将virtualenv目录最终检入到存储库中才能正常工作?如果变量包含您不想在存储库中使用的机密怎么办?您将如何处理?
fraxture

2
我真的不明白为什么在您的存储库中包含virtualenv是一个好主意,因为它们不是非常可移植的,但是我想您可以将导出文件放在一个单独的文件中,而不是将激活脚本放在一个文件中,并在它存在,并且不要将该文件添加到您的存储库中。
TheLetterN

18

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

如果您正在寻找一种更简单的方法,第二种方法是在本地拥有一个.env文件,然后运行:

export $(cat .env)

6

安装autoenv或者通过

$ pip install autoenv

(要么)

$ brew install autoenv

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

$ echo "source bin/activate" > .env

现在一切正常。


3

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.