---
url: /blog/jupyter-env-fix/index.md
---
## 问题现象

在 VS Code 的 Jupyter Notebook 中，`os.getenv()` 返回 `None`，但系统环境变量明明已经设置了：

```python
import os
api_key = os.getenv("SILICONFLOW_API_KEY")
print(api_key)  # 输出: None
```

在终端直接运行同样的 Python 代码却能正常读取：

```powershell
python -c "import os; print(os.getenv('SILICONFLOW_API_KEY'))"
# 输出: sk-xxxxx... ✅ 正常
```

## 根因

**VS Code 在启动时捕获环境变量快照，之后新设置的系统环境变量不会自动同步到已运行的 VS Code 实例中。**

Jupyter 内核继承的是 VS Code 进程启动时的环境，而不是你当前终端的环境。所以即使你：

* ❌ 重启 Jupyter 内核 → 无效，内核仍然继承 VS Code 启动时的旧环境
* ❌ 在系统设置中新增了环境变量 → VS Code 进程不会感知

## 验证方法

在 PowerShell 中确认环境变量确实存在：

```powershell
# PowerShell 语法（注意不是 CMD 的 echo %VAR%）
$env:SILICONFLOW_API_KEY
# 输出: sk-xxxxx... ✅

# 或者用 .NET 方法查看 User 级别环境变量
[System.Environment]::GetEnvironmentVariable("SILICONFLOW_API_KEY", "User")
```

## 解决方案

### 方案一：完全重启 VS Code（推荐）

**关闭 VS Code → 重新打开**。VS Code 重新启动时会重新读取系统环境变量，Jupyter 内核就能继承到了。

> ⚠️ 仅重启内核不够，必须重启 VS Code 本身。

### 方案二：使用 python-dotenv 加载 .env 文件

在 notebook 第一个 cell 中：

```python
from dotenv import load_dotenv
load_dotenv()  # 从项目根目录的 .env 文件加载

import os
api_key = os.getenv("SILICONFLOW_API_KEY")
print(api_key)  # ✅ 正常
```

项目根目录的 `.env` 文件：

```bash
# 注意：直接写真实值，不要写成 ${SILICONFLOW_API_KEY} 这种 shell 变量引用
SILICONFLOW_API_KEY=sk-你的真实key
```

### 方案三：在代码中临时设置（不推荐，仅调试用）

```python
import os
os.environ["SILICONFLOW_API_KEY"] = "sk-xxxxx"
```

## 注意事项

1. **`.env` 文件中的 `${VAR}` 语法**：`python-dotenv` 默认不会解析 shell 风格的变量引用。写成 `KEY=${KEY}` 读到的是字面量字符串 `${KEY}`，而不是系统环境变量的值。
2. **PowerShell vs CMD**：在 PowerShell 中查看环境变量用 `$env:VAR`，`echo %VAR%` 是 CMD 语法，在 PowerShell 中会原样返回 `%VAR%`，容易误判为"变量不存在"。
3. **环境变量作用域**：`[System.Environment]::SetEnvironmentVariable("KEY", "VALUE", "User")` 设置的是 User 级别，需要重启应用程序才能生效。
