Python-dotenv 从.env
文件中读取键值对,并可以将它们设置为环境变量。它有助于遵循 12 因素原则开发应用程序。
pip install python-dotenv
如果您的应用程序从环境变量中获取配置(例如 12 因素应用程序),则在开发中启动它不太实用,因为您必须自己设置这些环境变量。
为了帮助您实现这一点,您可以将 Python-dotenv 添加到您的应用程序中,使其在.env
文件存在时(例如在开发中)加载配置,同时通过环境保持可配置性:
from dotenv import load_dotenv
load_dotenv () # take environment variables
# Code of your application, which uses environment variables (e.g. from `os.environ` or
# `os.getenv`) as if they came from the actual environment.
默认情况下, load_dotenv
不会覆盖现有环境变量,而是在与 python 脚本相同的目录中查找.env
文件,或者逐步向上搜索。
要配置开发环境,请在项目的根目录中添加.env
:
.
├── .env
└── foo.py
python-dotenv 支持的.env
文件的语法与 Bash 类似:
# Development settings
DOMAIN=example.org
ADMIN_EMAIL=admin@ ${DOMAIN}
ROOT_URL= ${DOMAIN} /app
如果您在值中使用变量,请确保它们被{
和}
包围,例如${DOMAIN}
,因为$DOMAIN
等裸变量不会扩展。
您可能需要将.env
添加到.gitignore
中,特别是如果它包含密码等秘密。
有关可以在.env
文件中写入的内容的更多信息,请参阅下面的“文件格式”部分。
函数dotenv_values
工作方式与load_dotenv
大致相同,只是它不接触环境,它只是返回一个包含从.env
文件解析的值的dict
。
from dotenv import dotenv_values
config = dotenv_values ( ".env" ) # config = {"USER": "foo", "EMAIL": "[email protected]"}
这尤其支持高级配置管理:
import os
from dotenv import dotenv_values
config = {
** dotenv_values ( ".env.shared" ), # load shared development variables
** dotenv_values ( ".env.secret" ), # load sensitive variables
** os . environ , # override loaded values with environment variables
}
load_dotenv
和dotenv_values
通过其stream
参数接受流。因此可以从文件系统以外的源(例如网络)加载变量。
from io import StringIO
from dotenv import load_dotenv
config = StringIO ( "USER=foo n [email protected]" )
load_dotenv ( stream = config )
您可以在 IPython 中使用 dotenv。默认情况下,它将使用find_dotenv
来搜索.env
文件:
% load_ext dotenv
% dotenv
您还可以指定路径:
% dotenv relative / or / absolute / path / to / . env
可选标志:
-o
覆盖现有变量。-v
增加详细程度。 还包括 CLI 界面dotenv
,它可以帮助您操作.env
文件,而无需手动打开它。
$ pip install " python-dotenv[cli] "
$ dotenv set USER foo
$ dotenv set EMAIL [email protected]
$ dotenv list
USER=foo
[email protected]
$ dotenv list --format=json
{
" USER " : " foo " ,
" EMAIL " : " [email protected] "
}
$ dotenv run -- python foo.py
运行dotenv --help
以获取有关选项和子命令的更多信息。
该格式尚未正式指定,并且仍在随着时间的推移而改进。话虽这么说, .env
文件大部分看起来应该像 Bash 文件。
键可以不带引号或单引号。值可以不加引号、单引号或双引号。键、等号和值前后的空格将被忽略。值后面可以跟有注释。行可以以export
,这不会影响它们的解释。
允许的转义序列:
\
, '
\
、 '
、 "
、 a
、 b
、 f
、 n
、 r
、 t
、 v
单引号或双引号值可以跨越多行。以下示例是等效的:
FOO= " first line
second line "
FOO= " first linensecond line "
变量可以没有值:
FOO
它会导致dotenv_values
将该变量名称与值None
相关联(例如{"FOO": None}
。另一方面, load_dotenv
会简单地忽略此类变量。
这不应与FOO=
混淆,在这种情况下,变量与空字符串关联。
Python-dotenv 可以使用 POSIX 变量扩展来插入变量。
使用load_dotenv(override=True)
或dotenv_values()
,变量的值是以下列表中定义的第一个值:
.env
文件中该变量的值。使用load_dotenv(override=False)
时,变量的值是以下列表中定义的第一个值:
.env
文件中该变量的值。该项目目前由 Saurabh Kumar 和 Bertrand Bonnefoy-Claudet 维护,如果没有这些了不起的人的支持,这个项目是不可能实现的。