在 VsCode 更新笔记本上的 env 变量

update env variable on notebook in VsCode

我正在 python 项目中使用笔记本和 VsCode 上的 .env 文件。 我在尝试刷新笔记本中的环境变量时遇到问题(我找到了一种方法,但它非常棘手)。

我的项目:

.env 文件包含:MY_VAR="HELLO_ALICE"

test.ipynb 一个单元格的文件:

from os import environ
print('MY_VAR = ', environ.get('MY_VAR'))

我想要的:

  1. 设置环境变量和运行我的笔记本(参见HELLO_ALICE)
  2. 编辑 .env 文件:将“HELLO_ALICE”更改为“HELLO_BOB”
  3. 设置环境变量和运行我的笔记本(参见HELLO_BOB)

什么不起作用:

  1. 在 vsCode 中打开我的项目,打开终端
  2. 在终端 运行 中:>> set -a; source .env; set +a;
  3. 打开笔记本,运行 单元格 --> 我看到 HELLO_ALICE
  4. 编辑 .env(将 HELLO_ALICE 更改为 HELLO_BOB)
  5. 重新启动笔记本(单击重新启动或关闭选项卡并重新打开)
  6. 在终端 运行 中:>> set -a; source .env; set +a;(与步骤 2 相同)
  7. 打开笔记本,运行 单元格 --> 我看到 HELLO_ALICE

所以我看到两次 HELLO_ALICE 而不是 HELLO_ALICE 然后 HELLO_BOB...

但如果它是在 .py 文件而不是笔记本上,它会起作用(我会先看到 HELLO_ALICE 然后 HELLO_BOB)

使其工作:

将第 5 步替换为:关闭 VsCode 并重新打开它

为什么是问题:

超级棘手。我敢肯定,在 3 个月内我会通过快速修复忘记这个问题,我最终会再次失去半天时间来找出问题所在和解决方案。

所以我的问题是:

有谁知道为什么它会这样工作以及如何避免关闭和重新打开 VsCode 以刷新存储在笔记本上的 .env 文件中的环境变量?

(关闭和重新打开 VsCode 不应改变代码的行为)

备注:

我在使用你提到的 VS Code 版本时遇到了同样的问题。

我发现一个快速的 DIY 解决方案(绝对不是最好的)是使用 python-dotenv 自己在笔记本的第一个单元格上重新加载环境变量(您还必须在之后重新启动笔记本更改文件)。

示例:

import dotenv
import os

# Reload the variables in your '.env' file (override the existing variables)
dotenv.load_dotenv(".env", override=True)

# 'MY_VAR' is refreshed now
print('MY_VAR = ', os.environ.get('MY_VAR')) # MY_VAR = HELLO_BOB

无论如何,我认为这可能是 vscode-jupyter 扩展中的错误。我认为每次重新启动笔记本时自动覆盖 .env 文件中的环境变量是有道理的。

您在 VSC 中打开的终端不是同一个终端 ipython 内核是 运行。内核已经 运行 在不受您在另一个终端中更改变量影响的环境中。您需要在正确的环境中设置变量。您可以使用 dotenv 来做到这一点,但请记住使用 override=True。 这似乎有效:

import dotenv
from os import environ
env_file = '../.env'

f = open(env_file,'w')
f.write('MY_VAR="HELLO_ALICE"')
f.close()
dotenv.load_dotenv(env_file, override=True)
print('MY_VAR = ', environ.get('MY_VAR'))

f = open(env_file,'w')
f.write('MY_VAR="HELLO_BOB"')
f.close()
dotenv.load_dotenv(env_file, override=True)
print('MY_VAR = ', environ.get('MY_VAR'))
MY_VAR =  HELLO_ALICE
MY_VAR =  HELLO_BOB