推荐使用 os.environ.get() 获取环境变量,因其可设默认值并避免 KeyError;直接索引会因缺失键导致进程崩溃,且需注意大小写敏感、空值处理、类型转换异常及敏感字段校验。

os.environ.get() 是唯一推荐的入口,直接用 os.environ['KEY'] 在变量缺失时必然抛 KeyError,线上服务一崩就是整条链路。
为什么不能直接用方括号取值
因为 os.environ 本质是映射对象,不是普通字典,但行为上对缺失键会严格报错:KeyError: 'DB_HOST'。这在配置不全的 CI 环境、本地调试或容器未注入变量时高频发生。
- 哪怕只漏一个
SECRET_KEY,os.environ['SECRET_KEY']就让进程退出 -
in判断只能确认存在性,不能替代取值逻辑 - Windows 下环境变量名大小写不敏感,但 Python 的
os.environ仍按原始大小写匹配,比如os.environ['path'](小写)在 Windows 上也返回KeyError
get() 的默认值不是“可选”,而是“必须指定”
不带默认值的 os.environ.get('DEBUG') 返回 None,后续做字符串操作(如 .lower())会触发 AttributeError;更糟的是,int(None) 直接 TypeError。
- 关键配置项必须给明确默认值:
os.environ.get('PORT', '8000') - 布尔型别写成
os.environ.get('DEBUG', 'false').lower() in ('1', 'true', 'yes', 'on'),而不是依赖单一字符串比较 - 空字符串
''和None行为不同,get()返回None仅当键完全不存在;若系统设了DEBUG=(空值),get()返回'',需额外判断
类型转换必须显式加 try/except
所有环境变量值都是字符串,int(os.environ.get('RETRY_COUNT')) 看似简洁,但一旦值是 'abc' 或 '',就炸在运行时。
- 数值转换务必包
try/except ValueError,不要假设输入干净 - 列表解析如
[x.strip() for x in os.environ.get('ALLOWED_HOSTS', '').split(',')]要先检查非空,否则''分割得[''],可能意外放行空 host - 敏感字段如
SECRET_KEY建议加长度校验:if len(secret)
修改 os.environ 只影响当前进程,且不可逆
os.environ['LOG_LEVEL'] = 'DEBUG' 确实能改,但它不会写回系统,也不会被父进程看到,更不会同步到已启动的线程里——尤其在多线程 Web 服务中,主线程改了,worker 线程未必感知。
立即学习“Python免费学习笔记(深入)”;
- 子进程会继承修改后的环境,但仅限
subprocess.run()等新启进程 -
os.environ.pop('TEMP_VAR', None)可用于清理临时变量,避免污染后续逻辑 - 绝不要在模块顶层赋值
os.environ['X'] = ...,它会在 import 阶段执行,而此时环境可能还没完全加载(比如load_dotenv()还没调)


















