python - 在 virtualenv 中设置环境变量

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

有没有办法在virtualenv里面设置远程机器上定义的环境变量?

最佳答案

如果您使用 virtualenvwrapper (我强烈建议这样做),您可以使用 $VIRTUAL_ENV/bin/ 中的同名脚本定义不同的钩子(Hook)(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

如果您想将此配置保留在您的项目目录中,只需从您的项目目录创建一个符号链接(symbolic link)到 $VIRTUAL_ENV/bin/postactivate

$ rm $VIRTUAL_ENV/bin/postactivate
$ ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate

你甚至可以automate the creation of the symlinks每次使用 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

https://stackoverflow.com/questions/9554087/

相关文章:

python - 我可以为 requests.request 设置 max_retries 吗?

python - 运行 `pip install` 的 Ubuntu 给出错误 'The follo

linux - 无法连接到位于 unix :/var/run/docker. sock 的 Dock

linux - sudo bang bang 到底是什么?

python - 如何在 Python 中使用省略号切片语法?

linux - fork: retry: 资源暂时不可用

linux - 目录上次修改日期

python - 如何在 Django 模板中获取我网站的域名?

python - 我传入的 Django 请求中的 JSON 数据在哪里?

linux - 如何在网络上的 2 个文件夹中获取所有文件之间的差异?