在 VsCode 中更新笔记本上的环境变量

Vin*_*e M 7 python environment-variables visual-studio-code jupyter-notebook

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

\n

我的项目:

\n

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

\n

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

\n
from os import environ\nprint(\'MY_VAR = \', environ.get(\'MY_VAR\'))\n
Run Code Online (Sandbox Code Playgroud)\n

我想要的是:

\n
    \n
  1. 设置环境变量并运行我的笔记本(请参阅 HELLO_ALICE)
  2. \n
  3. 编辑 .env 文件:将“HELLO_ALICE”更改为“HELLO_BOB”
  4. \n
  5. 设置环境变量并运行我的笔记本(请参阅 HELLO_BOB)
  6. \n
\n

什么不起作用:

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

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

\n

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

\n

为了使其发挥作用:

\n

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

\n

为什么这是一个问题:

\n

这非常棘手。我确信 3 个月后我会通过快速修复忘记这个问题,最终我会再次失去半天的时间来找出问题所在和解决方案。

\n

所以我的问题是:

\n

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

\n

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

\n

笔记:

\n
    \n
  • VsCode 版本 = 1.63.2
  • \n
  • 我厌倦了在笔记本中使用 dotenv 模块并加载 env 变量(不起作用)
  • \n
  • 问题:仅当您在笔记本中定义环境变量时,如何在 Jupyter 笔记本中设置环境变量才有效
  • \n
  • 此行为仅发生在环境变量上。例如,如果我使用 env.py 文件代替 .env 文件,其中我将 env 常量定义为 python 变量,则重新启动笔记本将刷新常量。
  • \n
\n

小智 7

您在 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'))
Run Code Online (Sandbox Code Playgroud)
MY_VAR =  HELLO_ALICE
MY_VAR =  HELLO_BOB
Run Code Online (Sandbox Code Playgroud)