博客
关于我
Python 中更优雅的环境变量设置方案
阅读量:159 次
发布时间:2019-02-27

本文共 3126 字,大约阅读时间需要 10 分钟。

Python环境变量管理实用指南

在软件开发过程中,环境变量是连接开发环境、测试环境或生产环境的重要桥梁。它们可以配置调试开关、日志级别、数据库连接等关键参数,为项目的运行提供灵活性和可控性。本文将详细介绍如何在Python项目中设置和获取环境变量,并展示如何使用第三方库environs来简化操作。


环境变量的设置与获取

1. 环境变量的基本使用

我们首先看一个最简单的Python示例,了解如何设置和获取环境变量。

import os
print(os.environ['VAR1']) # 会抛出 KeyError('VAR1') 如果 VAR1 没有设置

运行该代码时,如果没有设置VAR1环境变量,程序会抛出KeyError错误。为了避免这种情况,可以通过命令行设置环境变量:

VAR1=germey python3 main.py

这样,程序就能成功获取VAR1的值germey。然而,这个设置仅在当前命令行有效,下次运行时需要重新设置。


2. 使用export命令永久设置环境变量

为了让环境变量在多次命令行运行中生效,可以使用export命令:

export VAR1=germey

这样,VAR1将在当前终端会话中生效。然而,关闭终端后,这些设置会丢失。


3. 安全的环境变量获取方式

直接通过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 Env
env = Env()
# 获取字符串
value_str = env("VAR1")
# 获取整数,默认值为1
value_int = env.int("VAR2", 1)
# 获取浮点数,默认值为5.5
value_float = env.float("VAR3", 5.5)
# 获取JSON格式数据
value_json = env.json("VAR4")

环境变量设置示例

export VAR1=germey
export VAR2=2
export VAR3=3.14
export VAR4='{"name": "germey"}'

运行代码后,value_str将为'germey'value_int2value_float3.14value_json{'name': 'germey'}


常见环境变量类型及其设置

1. 布尔值

export ENABLE_DEBUG=true
export DISABLED_FEATURE=false

获取时:

debug_enabled = env.bool("ENABLE_DEBUG", False)  # 如果 ENABLE_DEBUG 未设置,默认为 False
feature_disabled = env.bool("DISABLED_FEATURE", True) # 如果 DISABLED_FEATURE 未设置,默认为 True

2. 日期与时间

export SHIP_DATE=2024-05-15
export TIMEOUT=30

获取时:

from datetime import date, timedelta
ship_date = env.date("SHIP_DATE")
timeout = env.timedelta("TIMEOUT")

3. 列表与字典

export COORDINATES=23.3,50.0
export CONFIGS=key1=value1,key2=value2

获取时:

coordinates = env.list("COORDINATES", subcast=float)  # 转换为浮点数列表
configs = env.dict("CONFIGS") # 转换为字典

4. UUID

export MY_UUID=abcdef1234567890abcdef1234

获取时:

my_uuid = env.uuid("MY_UUID")

文件读取与前缀处理

读取.env文件

environs可以读取当前目录下的.env文件:

from environs import Env
env = 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, Email
from environs import Env
env = 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=lolcathost
export PROXY_PORT=1080
export PROXY_USERNAME=germey
export PROXY_PASSWORD=mypassword
# 日志配置
export LOG_LEVEL=DEBUG
export LOG_DIR=logs
# 生产环境配置
export APP_ENV=prod
export APP_DEBUG=False

结语

环境变量是软件开发中不可或缺的一部分。通过合理设置和获取环境变量,可以提升项目的灵活性和维护性。无论是通过命令行设置,还是使用environs库,关键在于找到最适合项目需求的方案。

转载地址:http://izpd.baihongyu.com/

你可能感兴趣的文章
nghttp3使用指南
查看>>
Nginx
查看>>
nginx + etcd 动态负载均衡实践(三)—— 基于nginx-upsync-module实现
查看>>
nginx + etcd 动态负载均衡实践(二)—— 组件安装
查看>>
nginx + etcd 动态负载均衡实践(四)—— 基于confd实现
查看>>
Nginx + Spring Boot 实现负载均衡
查看>>
Nginx + uWSGI + Flask + Vhost
查看>>
Nginx - Header详解
查看>>
Nginx - 反向代理、负载均衡、动静分离、底层原理(案例实战分析)
查看>>
nginx 1.24.0 安装nginx最新稳定版
查看>>
nginx 301 永久重定向
查看>>
nginx css,js合并插件,淘宝nginx合并js,css插件
查看>>
Nginx gateway集群和动态网关
查看>>
Nginx Location配置总结
查看>>
Nginx log文件写入失败?log文件权限设置问题
查看>>
Nginx Lua install
查看>>
nginx net::ERR_ABORTED 403 (Forbidden)
查看>>
Nginx SSL私有证书自签,且反代80端口
查看>>
Nginx upstream性能优化
查看>>
Nginx 中解决跨域问题
查看>>