本文共 3126 字,大约阅读时间需要 10 分钟。
在软件开发过程中,环境变量是连接开发环境、测试环境或生产环境的重要桥梁。它们可以配置调试开关、日志级别、数据库连接等关键参数,为项目的运行提供灵活性和可控性。本文将详细介绍如何在Python项目中设置和获取环境变量,并展示如何使用第三方库environs来简化操作。
我们首先看一个最简单的Python示例,了解如何设置和获取环境变量。
import osprint(os.environ['VAR1']) # 会抛出 KeyError('VAR1') 如果 VAR1 没有设置 运行该代码时,如果没有设置VAR1环境变量,程序会抛出KeyError错误。为了避免这种情况,可以通过命令行设置环境变量:
VAR1=germey python3 main.py
这样,程序就能成功获取VAR1的值germey。然而,这个设置仅在当前命令行有效,下次运行时需要重新设置。
export命令永久设置环境变量为了让环境变量在多次命令行运行中生效,可以使用export命令:
export VAR1=germey
这样,VAR1将在当前终端会话中生效。然而,关闭终端后,这些设置会丢失。
直接通过os.environ获取环境变量可能不够安全,因为未设置的变量会抛出错误。我们可以改用os.environ.get()方法:
value = os.environ.get('VAR1', '默认值') # 如果 VAR1 未设置,返回默认值 这样,程序不会抛出错误,而是返回默认值'默认值'。进一步优化可以使用get方法的第二个参数指定默认值:
value = os.environ.get('VAR1', 'germey') 这让环境变量的获取变得更加安全和友好。
environs库为了更方便地处理不同类型的环境变量(如整数、浮点数、字符串等),可以使用environs库。它支持多种类型转换,简化了环境变量的管理。
environs库通过以下命令安装:
pip3 install environs
from environs import Envenv = Env()# 获取字符串value_str = env("VAR1")# 获取整数,默认值为1value_int = env.int("VAR2", 1)# 获取浮点数,默认值为5.5value_float = env.float("VAR3", 5.5)# 获取JSON格式数据value_json = env.json("VAR4") export VAR1=germeyexport VAR2=2export VAR3=3.14export VAR4='{"name": "germey"}' 运行代码后,value_str将为'germey',value_int为2,value_float为3.14,value_json为{'name': 'germey'}。
export ENABLE_DEBUG=trueexport DISABLED_FEATURE=false
获取时:
debug_enabled = env.bool("ENABLE_DEBUG", False) # 如果 ENABLE_DEBUG 未设置,默认为 Falsefeature_disabled = env.bool("DISABLED_FEATURE", True) # 如果 DISABLED_FEATURE 未设置,默认为 True export SHIP_DATE=2024-05-15export TIMEOUT=30
获取时:
from datetime import date, timedeltaship_date = env.date("SHIP_DATE")timeout = env.timedelta("TIMEOUT") export COORDINATES=23.3,50.0export CONFIGS=key1=value1,key2=value2
获取时:
coordinates = env.list("COORDINATES", subcast=float) # 转换为浮点数列表configs = env.dict("CONFIGS") # 转换为字典 export MY_UUID=abcdef1234567890abcdef1234
获取时:
my_uuid = env.uuid("MY_UUID") .env文件environs可以读取当前目录下的.env文件:
from environs import Envenv = Env()# 读取`.env`文件env.read_env()# 获取环境变量app_mode = env("APP_MODE")log_level = env.log_level("LOG_LEVEL") # 转换为 logging 日志级别 通过prefixed方法可以对带前缀的环境变量进行分组处理:
with env.prefixed("DB_"): db_host = env("HOST", "localhost") db_port = env.int("PORT", 5432) 在某些场景下,环境变量的输入可能存在安全隐患。为了防止非法输入,可以使用marshmallow库进行验证。
from marshmallow.validate import OneOf, Length, Emailfrom environs import Envenv = Env()# 检查 NODE_ENV 是否为 'production' 或 'development'env.str("NODE_ENV", validate=OneOf(["production", "development"], error=" NODE_ENV 必须是 production 或 development"))# 检查 EMAIL 是否为有效格式env.str("EMAIL", validate=[Length(min=4), Email()])# 获取验证结果validate_errors = env.str("VALIDATE_ERRORS", "") # 代理池配置export PROXY_HOST=lolcathostexport PROXY_PORT=1080export PROXY_USERNAME=germeyexport PROXY_PASSWORD=mypassword# 日志配置export LOG_LEVEL=DEBUGexport LOG_DIR=logs# 生产环境配置export APP_ENV=prodexport APP_DEBUG=False
环境变量是软件开发中不可或缺的一部分。通过合理设置和获取环境变量,可以提升项目的灵活性和维护性。无论是通过命令行设置,还是使用environs库,关键在于找到最适合项目需求的方案。
转载地址:http://izpd.baihongyu.com/