%env 魔术命令可设置当前 kernel 的环境变量并同步至子进程,重启 kernel 后失效;!export 无效因其仅作用于瞬时 shell 子进程;持久化需修改配置文件或系统级环境变量。

在 Notebook 单元格里用 %env 设置环境变量
可以直接在代码单元格中运行 %env 魔术命令,它会立即生效并影响后续所有 Python 子进程(比如 subprocess.run、os.system 或调用外部 CLI 工具时)。
注意:%env 只对当前 kernel 生效,重启 kernel 后丢失;它不修改系统级环境变量,也不影响其他已启动的进程。
-
%env MY_KEY=value—— 设置单个变量 -
%env MY_PATH=/usr/local/bin:/home/user/bin—— 支持带冒号的路径赋值 -
%env -p—— 查看当前 kernel 所有已设置的环境变量(含继承自启动时的) - 若变量值含空格或特殊字符,建议用引号包裹:
%env LOG_LEVEL="debug mode"
os.environ 和 %env 的区别必须分清
os.environ 是 Python 标准库对象,直接操作它也能改环境变量,但行为和 %env 不完全一致:
-
os.environ['KEY'] = 'value'确实能写入,但某些底层库(如subprocess调用 C 二进制时)可能读不到刚设的值,因为没触发 libc 的putenv同步 -
%env内部做了更完整的同步,兼容性更好,推荐优先用它 -
os.environ修改后,用os.environ.get('KEY')能立刻读到;但%env -p不一定立刻显示——这是显示逻辑差异,不是实际没生效
为什么 !export KEY=xxx 在 Notebook 里无效
在单元格里写 !export MY_VAR=123 看似合理,但根本不起作用。原因很直接:
-
!前缀执行的是 shell 子进程,export只在那个瞬时子进程里生效,退出即销毁 - 它不会反向注入到 Jupyter kernel 的 Python 进程中,也不会影响后续
!命令(每次都是新 shell) - 同理,
!set KEY=xxx(Windows)也一样无效
想验证?运行 !echo $MY_VAR 紧接着 !export MY_VAR=test 再 !echo $MY_VAR —— 第二行永远为空。
需要持久化?别依赖 Notebook 单元格
如果变量要跨 kernel 重启、跨 notebook、或被其他工具(如 VS Code 的 Jupyter 插件、Docker 容器内启动)识别,单元格级设置就不够了:
- 临时方案:把
%env命令放在第一个初始化 cell,每次打开 notebook 都手动运行一次 - 真正持久:改
jupyter_notebook_config.py,加c.NotebookApp.environment = {'KEY': 'value'}(注意这是 Notebook 服务级变量,不是 kernel 级) - 最通用:在系统或用户级环境变量中设置(如 Linux 的
~/.bashrc,Windows 的系统属性 → 环境变量),然后重启 Jupyter(不是 kernel,是整个服务进程)
容易忽略的一点:Jupyter Lab 和 Notebook 对 c.NotebookApp.environment 的支持程度不同,Lab 有些版本会忽略它,得靠 kernel 启动脚本或 wrapper 来兜底。











