Python-env变量读取

记录Python进行环境变量的读取->最佳实践【dotenv】+【os】

1-知识整理

  • 1)使用python自带的os进行【环境变量】读取

    import os
    home = os.getenv('OPEN_API_KEY')
    print(home, path)
    
  • 2)使用python-dotenv

    # 依赖安装
    pip install python-dotenv
    
    
    # 代码逻辑
    from pathlib import Path
    from dotenv import load_dotenv
    import os
    
    # 使用dotenv读取配置文件的配置到环境变量
    load_dotenv(Path(__file__).resolve().parent / ".env")   # 显式给路径,避免找不到
    
    # 再使用os进行环境变量读取
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
    DEBUG = os.getenv("DEBUG", "false").lower() == "true"
    

2-参考网址

  • 【阿里百炼】linux/macos/windows不同的配置参考:https://bailian.console.aliyun.com/?spm=5176.29619931.J__Z58Z6CX7MY__Ll8p1ZOR.1.38fe521cU3isvj&tab=api#/api/?type=model&url=2803795


3-知识详解

1-os读取环境变量

在 Python 里,os.getenv 是标准库 os 提供的最常用、最安全的“读环境变量”接口。
它只做一件事:到当前进程的环境变量表里找指定名字,找到了就返回字符串,找不到就返回 None(或你指定的默认值)。


1. 基本用法

import os

# 读取单个变量
home = os.getenv('HOME')          # Linux/macOS 例子
path = os.getenv('PATH')          # 所有系统都有
print(home, path)

# 变量不存在时避免 None
port = os.getenv('APP_PORT', '8000')   # 没配就默认 8000
debug = os.getenv('DEBUG', '').lower() in ('1', 'true', 'yes')

2. 与 os.environ 的区别

特性 os.getenv(key, default) os.environ[key]
找不到时 返回 default / None 抛 KeyError
类型 函数调用 类似 dict 的映射
能否改值 只读 可写:os.environ['x']='y'
线程安全 是(但改值需加锁)

90% 的场景用 os.getenv 就够了;只有需要“强制必须存在”或需要修改时才用 os.environ


3. 常见踩坑

  1. 大小写敏感
    Windows 在系统层面不区分大小写,但 os.getenv 内部仍区分;建议统一大写。
  2. 子进程隔离
    在代码里 os.environ['X']='y' 只会影响当前进程及其后续子进程,不会影响调用你的 shell
  3. PyCharm / VS Code 终端
    在 IDE 里运行脚本时,IDE 会重新加载环境;如果改完 .bashrc重启 IDE 或重新打开终端
  4. Docker / systemd
    容器或 service 文件里写 ENV KEY=value 才是运行时可见;构建阶段的 ENV 对运行时也有效,但 ARG 无效。

4. 批量读取(可选技巧)

from typing import Dict

def envmap(*keys: str, **defaults: str) -> Dict[str, str]:
    """一次性取多个变量,支持默认值"""
    return {k: os.getenv(k, defaults.get(k, '')) for k in keys}

cfg = envmap('DB_HOST', 'DB_PORT', 'DB_USER', DB_PASSWORD='secret')

5. 完整示例:小型配置模块

# config.py
import os

class Config:
    # 数据库
    DB_HOST = os.getenv('DB_HOST', '127.0.0.1')
    DB_PORT = int(os.getenv('DB_PORT', '5432'))
    DB_USER = os.getenv('DB_USER', 'postgres')
    DB_PASS = os.getenv('DB_PASSWORD')        # 必须显式配置
    if DB_PASS is None:
        raise RuntimeError('环境变量 DB_PASSWORD 未设置')

    # 业务
    DEBUG   = os.getenv('DEBUG', '').lower() == 'true'
    LOG_LVL = 'DEBUG' if DEBUG else 'INFO'

# 其他文件
# from config import Config
# print(Config.DB_HOST)

6. 一句话总结

value = os.getenv('KEY', '默认值')

记住:
“读用 getenv,写用 environ,找不到就抛错用 environ[key],其余场景全用 getenv 最安全。”


2-dotenv读取业务参数

在 Python 里“管理”API_KEY 这类敏感环境变量,核心就三件事:

  1. 永远不把明文写进源码;
  2. 运行时能“无感”读到;
  3. 不同机器/部署阶段切换方便。

下面给出一条“从开发到上线”的常用路线,按推荐程度排序,你按需取用即可。


  1. 本地开发:.env 文件 + python-dotenv(最简单)

  1. 安装

    pip install python-dotenv
    
  2. 项目根目录建一个 .env 文件(记得 .gitignore 里加一行 .env

    OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    DEBUG=true
    
  3. 代码里一次性加载

    # settings.py
    from pathlib import Path
    from dotenv import load_dotenv
    import os
    
    load_dotenv(Path(__file__).resolve().parent / ".env")   # 显式给路径,避免找不到
    
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
    DEBUG = os.getenv("DEBUG", "false").lower() == "true"
    
  4. 其他模块直接 from settings import OPENAI_API_KEY 即可。
    换电脑只需复制 .env,不用改代码。


  1. 多环境/容器:shell 环境变量优先

  • 本地 export OPENAI_API_KEY=sk-xxx 即可覆盖 .env 里的值,方便临时调试。

  • Docker / docker-compose 里写:

    # docker-compose.yml
    services:
      app:
        environment:
          - OPENAI_API_KEY=${OPENAI_API_KEY}   # 从宿主机继承
    
  • Kubernetes、GitHub Actions、Vercel、Heroku 等都提供 UI 或 CLI 注入环境变量,
    原理一样:启动前由平台把变量写进容器进程的环境,代码里 os.getenv 就能读到。


  1. 生产加密:托管机密服务(可选)

  • AWS → AWS Secrets Manager / Parameter Store
  • GCP → Secret Manager
  • Azure → Key Vault

官方 SDK 都支持 client.get_secret("OPENAI_API_KEY")
配合 IAM 角色,服务器无需在本地落盘任何明文。
代价是增加一次网络请求和 IAM 配置,适合对合规要求高的场景。


  1. 常见坑

  1. .env 误提交到 GitHub → 立刻轮换密钥,用 git-filter-repo 清历史。
  2. Windows PowerShell 设置变量用 $Env:OPENAI_API_KEY="sk-xxx",不是 export
  3. os.environ["OPENAI_API_KEY"] 在变量不存在时会抛 KeyError
    os.getenv("OPENAI_API_KEY") 更稳,可给默认值。
  4. Jupyter / VS Code 重启内核后环境变量会刷新,
    如果 .env 改了要 load_dotenv(override=True) 或重启内核。

  1. 一句话总结

开发阶段用 .env + python-dotenv
上线后让平台把变量注进进程环境,
代码里永远只通过 os.getenv 读取,
这样本地、CI、生产都能无痛切换,也永远不会把密钥写进仓库。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐