如何在 Jupyter 笔记本中设置环境变量
- 2025-02-28 08:22:00
- admin 原创
- 110
问题描述:
我遇到了 Jupyter 无法在 bashrc 文件中看到环境变量的问题。有没有办法在 jupyter 中加载这些变量或向其中添加自定义变量?
解决方案 1:
要在 jupyter 笔记本中设置环境变量,只需使用%
魔术命令,或%env
,%set_env
例如%env MY_VAR=MY_VALUE
或%env MY_VAR MY_VALUE
。(%env
单独使用可打印出当前环境变量。)
参见:http://ipython.readthedocs.io/en/stable/interactive/magics.html
解决方案 2:
您还可以在文件中设置变量kernel.json
:
如果每次启动 jupyter 内核时都需要相同的环境变量,我的解决方案很有用,特别是当您为不同的任务有多组环境变量时。
要使用环境变量创建新的 ipython 内核,请执行以下操作:
阅读文档:https://jupyter-client.readthedocs.io/en/stable/kernels.html#kernel-specs
运行
jupyter kernelspec list
即可查看已安装内核的列表以及文件的存储位置。将包含 kernel.json 的目录(例如名为
python2
)复制到新目录(例如python2_myENV
)。display_name
在新文件中进行更改kernel.json
。添加
env
定义环境变量的字典。
display_name
您的内核 json 可能看起来像这样(除了和 之外,我没有修改已安装的 kernel.json 中的任何内容env
):
{
"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
解决方案 3:
如果您使用的是 Python,则可以在文件中定义环境变量,并使用python-dotenv.env
从 Jupyter 笔记本中加载它们。
安装 python-dotenv:
pip install python-dotenv
.env
在 Jupyter 笔记本中加载该文件:
%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
找到
解决方案 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
使用。export VARIABLE=value
`.bashrc`
就我而言,TensorFlow 需要导出的变量才能将其成功导入笔记本。
解决方案 7:
一个相关的(短期)解决方案是将环境变量存储在一个具有可预测格式的文件中,可以在启动终端时获取该文件并/或将其读入笔记本。例如,我有一个文件,,.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
文件可以位于任何地方,并且可以相对于包含笔记本文件的目录进行引用。这还有一个优点,就是不会在代码中的任何地方显示变量值。
解决方案 8:
如果你的笔记本是由 Jupyter Hub 生成的,你可能需要jupyterhub_config.py
通过设置来配置允许从 JupyterHub 进程环境转移到笔记本环境的环境变量列表
c.Spawner.env_keep = [VAR1, VAR2, ...]
(https://jupyterhub.readthedocs.io/en/stable/api/spawner.html#jupyterhub.spawner.Spawner.env_keep)
参见:Spawner.environment
解决方案 9:
如果您正在使用 systemd,我刚刚发现您似乎必须将它们添加到 systemd 单元文件中。这是在 Ubuntu 16 上。将它们放入 .profile 和 .bashrc(甚至 /etc/profile)会导致 ENV Vars 在 juypter 笔记本中不可用。
我必须编辑:
/lib/systemd/system/jupyer-notebook.service
并将我想要读取的变量放入单元文件中,例如:
Environment=MYOWN_VAR=theVar
只有这样我才能从 juypter 笔记本中读取它。
解决方案 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
解决方案 11:
结论
在 Linux 上的 Jupyter Notebook 中,加载 PyTorch 模型时,我必须运行!export CUDA_VISIBLE_DEVICES=0,1
以将张量分散到两个 GPU 上。这是让 ParallelData 代码工作的唯一方法。os.environ[]
或者%set_env
不工作。
这个答案几乎和这里另一个答案重复了
如果你使用 Keras 的话,这似乎是一样的,请参见上面的这个答案,这个答案占用了它,但是这个答案更进一步:
它将向您展示更多运行代码的方法,而无需更改 .bashrc 或 Jupyter Notebook 服务设置。
并且它强调,大多数其他答案可能完全是错误的,至少如果你必须在 GPU 之间分割张量,并且可能存在其他设置,其中 Python 代码无法很好地控制环境变量。
Shell 命令:export
/MY_ENV_VAR=0,1 python some_cuda_executable.py
对于CUDA_VISIBLE_DEVICES
和可能其他变量,%set_env
或者os.environ[]
不起作用,这个 Stack Overflow如何让 Jupyter Notebook 在多个 gpu 中的一个指定 gpu 上运行?遇到了同样的事情。因此,在某些设置中,您只需要在 CLI 中运行命令,而不是在 Python 中,然后,无法在纯 Python 代码中执行此操作。
反而:
!export ...
(在 Jupyter Notebook 单元中与需要这些环境变量的代码一起;它必须是同一个单元,并且必须在它的开头运行)。您也可以像使用一样在 CLI 执行中运行它
CUDA_VISIBLE_DEVICES=4,5,6,7 python forward_test_ins.py
。
最重要的是,除非你调整了 .bashrc(未经测试),否则你不应该在代码中写入os.environ[]
或,请参阅上面的答案,或者 Jupyter Notebook 服务设置(未经测试),请参阅上面的答案
。但请注意:如果你运行 python 文件,错误也会在 Jupyter Notebook 之外抛出。还请查看上面的kernel.json 文件的答案(未经测试)。%set_env
更多链接
更多信息请参见:
如何解决使用 DataParallel 训练的模型上 PyTorch 单 GPU 推理中的“CUDA:无效设备序号”错误?
os.environ[]
这证明它对和%set_env
代码都不起作用,这是 Transformers Trainer 中用于使用多 GPU 进行并行计算的 CUDA_VISIBLE_DEVICES 示例:“RuntimeError:模块必须在设备 cuda:6(device_ids[0])上具有其参数...但在设备 cuda:0 上找到了其中一个”,
设置 CUDA_VISIBLE_DEVICES 的条目没有效果 #9158。
解决方案 12:
jupyter 对 中定义的内容很敏感.profile
。您可以在那里定义您的环境变量(只需确保您注销/重新登录以便读取 .profile)
解决方案 13:
如果您有 vsCode,只需像往常一样在终端中创建环境,然后转到 jupyter 文件,然后单击右上角的选择内核,然后命令面板将打开环境路径,只需单击它就会获取环境。
扫码咨询,免费领取项目管理大礼包!