通过 .env
文件设置环境变量,但无法通过 os.getenv("OPENAI_API_KEY")
获取到值,通常是因为 没有正确加载 .env
文件到环境变量。以下是具体原因和解决方法:
原因分析
-
未使用
python-dotenv
库加载.env
文件.env
文件默认不会被 Python 自动识别,需通过第三方库(如python-dotenv
)手动加载环境变量。
-
代码顺序错误
- 在调用
os.getenv()
之前未加载.env
文件,或在初始化 OpenAI 客户端后才加载环境变量。
- 在调用
-
文件路径问题
.env
文件未放在项目根目录,或代码中未指定正确的文件路径。
-
变量名拼写错误
.env
文件中的变量名与代码中获取的变量名不一致(如大小写、下划线等)。
解决方法
1. 安装并配置 python-dotenv
库
首先安装依赖库:
pip install python-dotenv
然后在代码中 显式加载 .env
文件:
from dotenv import load_dotenv
# 加载 .env 文件(默认从项目根目录读取)
load_dotenv() # 关键步骤!
# 再获取环境变量
api_key = os.getenv("OPENAI_API_KEY")
2. 检查代码顺序
确保 先加载 .env
文件,再获取环境变量并初始化 OpenAI 客户端:
import os
from dotenv import load_dotenv
from openai import OpenAI
# 先加载环境变量!
load_dotenv()
# 再获取密钥
api_key = os.getenv("OPENAI_API_KEY")
# 最后初始化客户端
client = OpenAI(api_key=api_key)
3. 检查 .env
文件的位置和内容
-
文件位置
.env
文件需放在项目的 根目录(即与 Python 脚本同一目录,或程序运行的当前工作目录)。项目目录/ ├── .env <-- 确保文件在此处 └── your_code.py
-
文件内容
确保.env
文件中的变量名与代码中的名称一致,且无拼写错误:# .env 文件内容示例 OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- 不要添加引号(
""
或''
)。 - 键值对中间不要有空格(如
OPENAI_API_KEY = sk-...
是错误的)。
- 不要添加引号(
4. 验证环境变量是否加载成功
在代码中打印环境变量,检查是否已正确读取:
import os
from dotenv import load_dotenv
load_dotenv()
print(os.getenv("OPENAI_API_KEY")) # 应输出你的密钥,而非 None
如果输出为 None
,说明未正确加载 .env
文件,请检查:
.env
文件路径是否正确。- 是否调用了
load_dotenv()
。 - 变量名是否完全一致(包括大小写)。
常见问题排查
情况1:.env
文件在子目录中
如果 .env
文件不在根目录,需指定路径:
load_dotenv("path/to/.env") # 例如:load_dotenv("config/.env")
情况2:未安装 python-dotenv
未安装库会导致 load_dotenv()
报错 ImportError
,务必先执行:
pip install python-dotenv
情况3:代码中未调用 load_dotenv()
即使导入了库,也必须显式调用 load_dotenv()
才能加载变量。
完整代码示例
import os
from dotenv import load_dotenv
from openai import OpenAI
# 1. 加载 .env 文件
load_dotenv() # 确保文件在根目录!
# 2. 获取环境变量
api_key = os.getenv("OPENAI_API_KEY")
# 3. 初始化客户端
client = OpenAI(api_key=api_key)
# 4. 测试请求
try:
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Hello!"}]
)
print(response.choices[0].message.content)
except Exception as e:
print(f"Error: {e}")
最终验证
- 确保
.env
文件存在且内容正确。 - 确保
load_dotenv()
被调用。 - 打印
os.getenv("OPENAI_API_KEY")
确认密钥不为None
。 - 如果问题依旧,尝试重启 Python 解释器或 IDE(某些工具需要重启才能加载新环境变量)。
通过以上步骤,你的代码应能正确读取 .env
文件中的 OpenAI API 密钥。如果仍有问题,请检查文件权限或尝试绝对路径加载。