Python 如何读取环境变量?
os.environ['VAR'] 直接读取(不存在抛 KeyError);os.environ.get('VAR', '默认值') 适合可选配置;os.getenv() 等价。本文给出用法、默认值、类型转换与 .env 文件方案。
两种方式:os.environ['NAME'] 直接取(不存在会抛 KeyError);os.getenv('NAME', 'default') 适合可选配置;必填配置应显式检查并在缺失时报错,默认值不一定更安全。
基本用法
import os
db_host = os.environ['DB_HOST'] # 不存在则 KeyError
db_port = os.getenv('DB_PORT', '5432') # 仅变量不存在时使用默认值,空字符串不触发默认
debug = os.getenv('DEBUG') # 不存在返回 None
常见配套操作
# 判断是否存在
if 'API_KEY' in os.environ: ...
# 类型转换(环境变量永远是字符串!)
workers = int(os.getenv('WORKERS', '4'))
debug = os.getenv('DEBUG', '').lower() in ('1', 'true', 'yes')
# 设置/删除
os.environ['MY_VAR'] = 'value'
os.environ.pop('MY_VAR', None)
.env 文件(本地开发)
pip install python-dotenv
from dotenv import load_dotenv
load_dotenv() # 默认不覆盖已有变量;.env 含密钥时不要提交到版本库
常见问题(FAQ)
Q:改了环境变量 Python 进程里看不到? 环境变量在进程启动时继承——从父进程继承后,外部 shell 的修改不会自动进入已运行进程;本进程仍可修改 os.environ,新启动的子进程默认继承修改后的环境,已运行的父/兄弟进程不会被改动。
Q:密钥放环境变量安全吗? 可避免直接写入源码,但环境变量可能被进程检查、诊断输出或日志暴露;K8s Secret 也需要访问控制和存储加密,Base64 编码不是加密。