在 Python 应用程序中使用 .env 文件作为环境变量
应用程序是为了部署而设计的。在开发过程中,您需要考虑应用程序的运行环境,以及应用程序执行任务所需的潜在敏感信息或特定于环境的信息。
环境变量是软件开发人员向应用程序提供此类信息的关键方式之一,但是如果您在本地机器的环境中设置这些变量,那么在本地运行和测试依赖于环境变量的应用程序可能会很麻烦。
设置或更改环境变量的过程非常耗时,而且随着时间的推移,需要管理的环境变量数量会逐渐增多,最终失控。最终,命名冲突会成为一个问题,每个新变量都需要一个很长的前缀来与类似的变量区分开来。
使用.env
文件可以让你使用环境变量进行本地开发,而不会污染全局环境命名空间。它还能将环境变量的名称和值隔离到使用它们的同一项目中。
文件.env
是一个文本文件,其中包含应用程序所需的所有环境变量的键值对。此文件包含在您的项目本地,但不会保存到源代码管理中,这样您就不会将潜在的敏感信息置于风险之中。
# environment variables defined inside a .env file
GCP_PROJECT_ID=my-project-id
SERVICE_ACCOUNT_FILE=path/to/serviceAccountCredentials
STORAGE_BUCKET_NAME=my-super-important-data
几乎每种编程语言都有一个包或库,可用于从.env
文件(而不是从本地环境)读取环境变量。对于 Python 来说,这个库是python-dotenv。安装该库后,python-dotenv的平均用例只需要在项目中添加两行代码。
from dotenv import load_dotenv
load_dotenv()
load_dotenv()
将首先查找一个.env
文件,如果找到,它将从文件中加载环境变量并使您的项目可以像任何其他环境变量一样访问它们。
import os
from dotenv import load_dotenv
load_dotenv()
GCP_PROJECT_ID = os.getenv('GCP_PROJECT_ID')
SERVICE_ACCOUNT_FILE = os.getenv('SERVICE_ACCOUNT_FILE')
STORAGE_BUCKET_NAME = os.getenv('STORAGE_BUCKET_NAME')
如果在文件中找不到环境变量.env
,load_dotenv
则会在主机环境中按给定名称搜索变量。这意味着,当您的项目在本地运行且.env
文件存在时,将使用文件中定义的变量。当您的项目部署到不存在该文件的主机环境(例如虚拟机或 Docker 容器)时.env
,将改用主机环境中定义的环境变量。
默认情况下,load_dotenv
将在当前工作目录或任何父目录中查找.env
文件,但是如果您的特定用例需要将其存储在其他地方,您也可以指定路径。
from dotenv import load_dotenv
from pathlib import Path
dotenv_path = Path('path/to/.env')
load_dotenv(dotenv_path=dotenv_path)
对于大多数应用程序来说,这就是使用python-dotenv高效运行所需的全部信息,但是您还可以在python-dotenv文档中阅读一些其他功能。
使用文件的好处之一.env
是,在开发初期就考虑到环境变量会更加容易。在开发过程的早期阶段考虑这些因素,可以让你更轻松地完成应用程序的部署。
如果您将应用程序部署在 Docker 容器中,则可以通过在命令--env-file .env
中使用标志无缝过渡到在本地运行的容器中运行和测试应用程序。然后,Docker 将在容器环境中设置您通过python-dotenvdocker run
使用的相同环境变量。
如果没有.env
文件,环境变量虽然在本地测试应用程序时很繁琐,但却必不可少。通过使用.env
文件和python-dotenv库,环境变量的使用将变得更加易于管理,并且让您从一开始就能够以部署为出发点进行开发。