【发布时间】:2017-05-23 15:31:51
【问题描述】:
需要一个例子,请解释一下 python-dotenv 的用途。
我对文档有点困惑。
【问题讨论】:
标签: python environment-variables
需要一个例子,请解释一下 python-dotenv 的用途。
我对文档有点困惑。
【问题讨论】:
标签: python environment-variables
你可以像这样设置环境变量:
export PRIVATE_KEY=0X32323
然后使用os 模块阅读。
import os
private_key=os.getenv("PRIVATE_KEY")
但是这样,环境变量仅在 shell 处于活动状态时有效。如果关闭 shell 并重新启动它,则必须再次设置环境变量。 python-dotenv 阻止我们做这种重复的工作。为此创建.env 文件并以这种格式添加变量
PRIVATE_KEY=fb6b05d6e75a93e30e22334443379292ccd29f5d815ad93a86ee23e749227
然后在文件中你想访问 anv 变量
import os
from dotenv import load_dotenv
#default directory for .env file is the current directory
#if you set .env in different directory, put the directory address load_dotenv("directory_of_.env)
load_dotenv()
load_dotenv() 将从.env 设置环境变量,我们使用os 模块访问
private_key=os.getenv("PRIVATE_KEY")
【讨论】:
除了@Will 的回答之外,python-dotenv 模块还带有一个 find_dotenv() ,它将尝试查找 .env 文件。
# settings.py
import os
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())
SECRET_KEY = os.environ.get("SECRET_KEY")
DATABASE_PASSWORD = os.environ.get("DATABASE_PASSWORD")
【讨论】:
.env 文件就足够了
来自Github page:
从 .env 中读取键值对并将它们添加到环境变量中。使用 12 要素原则在开发和生产过程中管理应用设置非常有用。
假设您已在设置模块旁边创建了 .env 文件。
.
├── .env
└── settings.py
将以下代码添加到您的 settings.py 中
# settings.py
import os
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
SECRET_KEY = os.environ.get("SECRET_KEY")
DATABASE_PASSWORD = os.environ.get("DATABASE_PASSWORD")
.env 是一个简单的文本文件。每行列出每个环境变量,格式为 KEY="Value",忽略以 # 开头的行。
SOME_VAR=someval
# I am a comment and that is OK
FOO="BAR"
【讨论】:
GIRLFRIEND=None,则必须小心,因为print 显示None,所以在这种情况下,您必须检查type变量来区分。
.env 文件约定包括一个前导 .,这使得它在 mac 和 linux 系统上隐藏。您还可以将.env 添加到您的.gitignore 文件中,这样它就不能提交给版本控制。如果它只是本地和 gitignored,那么在其中输入密码就可以了。它应该只被称为.env,而不是很多。如果您想在不同环境的 CI/CD 中使用 dotenv,那么 stackoverflow.com/a/55581164/1335793 之类的东西可以工作,但取决于您的部署平台和流程。
in production using 12-factor principles 指的是 12factor.net/config 将配置存储在 env vars 中的原理。将它们存储在本地 gitignored .env 文件中只是导出环境变量的隐式助手,因此您不要忘记导出或运行 shell 脚本。部署到 prod 时,您会放弃 .env 文件。 load_dotenv() 和 os.environ.get 调用是独立的; dotenv 用于本地开发,您使用其他一些机制,例如您的 CI/CD 系统的 env vars secrets manager in prod,无论哪种方式 os.environ.get 部分始终有效。