【问题标题】:How to set env variable in Jupyter notebook如何在 Jupyter notebook 中设置环境变量
【发布时间】:2016-10-19 20:13:08
【问题描述】:

我的问题是 Jupyter 在 bashrc 文件中看不到 env 变量,有没有办法在 jupyter 中加载这些变量或向其中添加自定义变量?

【问题讨论】:

    标签: python bash environment-variables jupyter-notebook


    【解决方案1】:

    要在 jupyter notebook 中设置环境变量,只需使用 % 魔术命令,%env%set_env,例如 %env MY_VAR=MY_VALUE%env MY_VAR MY_VALUE。 (单独使用%env 打印出当前的环境变量。)

    见:http://ipython.readthedocs.io/en/stable/interactive/magics.html

    【讨论】:

    • 您是否尝试过引号?请注意,更改 os.environ 是不一样的——它只能更改(在内存中,当前 python 进程中)dict,并且不会真正设置 OS env var(例如,用于后续的 !shell 命令)。跨度>
    • 我删除了我之前的 cmets,因为它们不太准确 - 但请注意 %env 和 %set_env 魔术命令在后端使用 os.environ[var] = valgithub.com/ipython/ipython/blob/master/IPython/core/magics/…
    • @michael 有没有办法在所有笔记本上保持环境?以这种方式设置环境似乎只会保留当前笔记本的环境。
    • @michael,如何取消设置环境变量?
    【解决方案2】:

    您还可以在kernel.json 文件中设置变量:

    如果您每次启动 jupyter 内核时都需要相同的环境变量,我的解决方案很有用,尤其是当您为不同的任务设置多组环境变量时。

    要使用环境变量创建新的 ipython 内核,请执行以下操作:

    • 阅读https://jupyter-client.readthedocs.io/en/stable/kernels.html#kernel-specs的文档
    • 运行 jupyter kernelspec list 以查看包含已安装内核和文件存储位置的列表。
    • 将包含 kernel.json 的目录(例如名为 python2)复制到新目录(例如 python2_myENV)。
    • 在新的kernel.json 文件中更改display_name
    • 添加定义环境变量的env 字典。

    您的内核 json 可能如下所示(我没有从已安装的 kernel.json 中修改任何内容,除了 display_nameenv):

    {
     "display_name": "Python 2 with environment",
     "language": "python",
     "argv": [
      "/usr/bin/python2",
      "-m",
      "ipykernel_launcher",
      "-f",
      "{connection_file}"
     ],
     "env": {"LD_LIBRARY_PATH":""}
    }
    

    这种方法的用例和优点

    • 在我的用例中,我想设置变量LD_LIBRARY_PATH,它会影响已编译模块(例如,用 C 语言编写)的加载方式。使用 %set_env 设置此变量无效。
    • 我可以拥有多个不同环境的 python 内核。
    • 要更改环境,我只需要切换/重新启动内核,但不必重新启动 jupyter 实例(如果我不想丢失另一个笔记本中的变量,这很有用)。见-然而-https://github.com/jupyter/notebook/issues/2647

    【讨论】:

    • 您能否告诉我如何使用您建议的技术将C:\Program Files (x86)\Graphviz2.38\bin\dot.exe 添加到现有系统路径?如果我不使用管理员帐户,它会起作用吗?我正在使用 Windows 10。
    • 正是我需要的。 Homebrew 的 Python 会覆盖 sys.executable,除非事先设置了 PYTHONEXECUTABLE,您必须在 python 运行之前设置它。
    • 在我看来这是唯一正确的答案,因为它只使用 Jupyter 本身,而不是依赖于任何特定内核中可用的功能。
    • 我如何在 jupyter 中获取这些变量名?
    【解决方案3】:

    如果您使用的是 Python,则可以在 .env 文件中定义环境变量,然后使用 python-dotenv 从 Jupyter 笔记本中加载它们。

    安装python-dotenv:

    pip install python-dotenv
    

    在 Jupyter 笔记本中加载 .env 文件:

    %load_ext dotenv
    %dotenv
    

    【讨论】:

      【解决方案4】:

      您可以在代码中设置环境变量,如下所示:

      import sys,os,os.path
      sys.path.append(os.path.expanduser('~/code/eol_hsrl_python'))
      os.environ['HSRL_INSTRUMENT']='gvhsrl'
      os.environ['HSRL_CONFIG']=os.path.expanduser('~/hsrl_config')
      

      这当然是一个临时修复,要获得永久修复,您可能需要将变量导出到您的~.profile,更多信息可以找到here

      【讨论】:

      • 感谢 Kardaj,在 ~/.profile 中导出变量解决了它,似乎它不是从 bashrc 读取的,这有点奇怪。
      • michael's answer with %env MY_VAR=MY_VALUE 应该是这个问题的正确答案
      • @SidaZhou 为什么迈克尔的回答更好?
      • @SidaZhou 取决于用例-如果您希望凭据在环境中可用-并且不希望凭据在您的笔记本中(例如在源代码控制中),那么这并不理想。
      【解决方案5】:

      我遇到的一个问题:以下两个命令是等效的。注意第一个不能使用引号。有点违反直觉,在使用 %env VAR ... 时引用字符串将导致引号被包含为变量值的一部分,这可能不是您想要的。

      %env MYPATH=C:/Folder Name/file.txt
      

      import os
      os.environ['MYPATH'] = "C:/Folder Name/file.txt"
      

      【讨论】:

        【解决方案6】:

        如果您在启动笔记本之前需要设置变量,唯一对我有用的解决方案是 env VARIABLE=$VARIABLE jupyter notebook.bashrc 中的 export VARIABLE=value

        在我的例子中,tensorflow 需要导出的变量才能成功地将其导入笔记本。

        【讨论】:

          【解决方案7】:

          如果您使用的是 systemd,我刚刚发现您似乎必须将它们添加到 systemd 单元文件中。这在 Ubuntu 16 上。将它们放入 .profile 和 .bashrc(甚至是 /etc/profile)会导致 enV Vars 在 juypter 笔记本中不可用。

          我必须编辑:

          /lib/systemd/system/jupyer-notebook.service
          

          并将我想读取的变量放入单元文件中,例如:

          Environment=MYOWN_VAR=theVar
          

          只有这样我才能从 juypter notebook 中阅读它。

          【讨论】:

            【解决方案8】:

            一个相关的(短期)解决方案是将您的环境变量以可预测的格式存储在一个文件中,该文件可以在启动终端和/或读入笔记本时获取。例如,我有一个文件.env,其中包含VARIABLE_NAME=VARIABLE_VALUE 格式的环境变量定义(没有空行或额外空格)。在开始新的终端会话时,您可以在 .bashrc.bash_profile 文件中获取此文件,您可以将其读入笔记本中,例如,

            import os
            env_vars = !cat ../script/.env
            for var in env_vars:
                key, value = var.split('=')
                os.environ[key] = value
            

            我使用了相对路径来表明这个.env 文件可以存在于任何地方,并且可以相对于包含笔记本文件的目录进行引用。这还有一个优点是不会在代码中的任何地方显示变量值。

            【讨论】:

              【解决方案9】:

              如果您的 notebook 是由 Jupyter Hub 生成的,您可能需要配置(在 jupyterhub_config.py 中)允许通过设置从 JupyterHub 进程环境转移到 Notebook 环境的环境变量列表

              c.Spawner.env_keep = [VAR1, VAR2, ...]
              

              (https://jupyterhub.readthedocs.io/en/stable/api/spawner.html#jupyterhub.spawner.Spawner.env_keep)

              另见:Spawner.environment

              【讨论】:

                【解决方案10】:

                您可以使用 docker 运行 jupyter notebook,并且不必管理依赖关系泄漏。

                docker run -p 8888:8888 -v /home/mee/myfolder:/home/jovyan --name notebook1 jupyter/notebook
                docker exec -it notebook1 /bin/bash
                

                那么请向 jupyter 询问打开的笔记本, jupyter notebook list
                http:// 0.0.0.0:8888/?token=012456788997977a6eb11e45fffff
                Url可以复制粘贴,如果你改变了,请验证端口。

                创建一个笔记本并粘贴以下内容, 进入笔记本

                !pip install python-dotenv
                import dotenv
                %load_ext dotenv
                %dotenv
                

                【讨论】:

                  猜你喜欢
                  • 2022-08-24
                  • 2021-12-09
                  • 2021-02-11
                  • 2022-08-15
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-08-01
                  • 2016-11-19
                  • 2020-05-23
                  相关资源
                  最近更新 更多