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

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

Python环境变量管理实用指南

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


环境变量的设置与获取

1. 环境变量的基本使用

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

import osprint(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 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'}。


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

1. 布尔值

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

2. 日期与时间

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

获取时:

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

3. 列表与字典

export COORDINATES=23.3,50.0export 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 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/

你可能感兴趣的文章
Python在def函数中使用for循环
查看>>
Python在Conda环境中,但在Windows虚拟环境中没有激活
查看>>
python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
查看>>
python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
查看>>
Python图像处理:从内存加载jpeg
查看>>
python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
查看>>
python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
查看>>
python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
查看>>
python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
查看>>
Python哪个版本最稳定好用2023.10.19
查看>>
Python和黑客技术的渊源
查看>>
Python和RF编写接口自动化
查看>>
Python和RF编写web自动化
查看>>
python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
查看>>
python和java哪个更值得学——来自知乎高赞回答
查看>>
python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
查看>>
python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
查看>>
Python命名中尾随下划线有什么好处?
查看>>
Python启动脚本
查看>>
Python听写汇总结果
查看>>