【问题标题】:update env variable on notebook in VsCode在 VsCode 中更新笔记本上的 env 变量
【发布时间】:2022-01-12 13:41:49
【问题描述】:

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

我的项目:

.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 文件中的 env 变量?

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

注意事项:

  • VsCode 版本 = 1.63.2
  • 我厌倦了在笔记本中使用 dotenv 模块和加载 env 变量(不起作用)
  • 问题:How to set env variable in Jupyter notebook 仅在您在笔记本中定义环境变量时才有效
  • 这种行为只发生在环境变量上。例如,如果我使用 env.py 文件代替 .env 文件,我将我的 env 常量定义为 python 变量,重新启动笔记本将刷新常量。

【问题讨论】:

标签: python visual-studio-code jupyter-notebook environment-variables


【解决方案1】:

您在 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

【讨论】:

    【解决方案2】:

    我在使用你提到的 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 文件中的环境变量。

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 2021-02-07
      • 2021-11-02
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      相关资源
      最近更新 更多