如何检测当前代码是否运行在 Jupyter Notebook 环境里

最可靠方法是检查get_ipython()是否存在且其类型包含'ZMQInteractiveShell',再辅以JPY_PARENT_PID环境变量验证,可准确区分Jupyter Notebook、JupyterLab、Colab等与普通Python环境。

可以通过检查 Python 的运行环境变量或导入特定模块来判断代码是否在 Jupyter Notebook(或 JupyterLab)中执行。最常用、可靠的方法是检测 get_ipython() 是否存在且其类型是否为 Jupyter 相关的交互式 shell。

方法一:检查 get_ipython() 和其类型

这是最主流、兼容性最好的方式,适用于 Jupyter Notebook、JupyterLab、Google Colab 等基于 IPython 的环境:

  • 调用 get_ipython(),若在 IPython/Jupyter 中会返回一个 shell 实例;在普通 Python 解释器或脚本中会抛出 NameError
  • 进一步检查其 __class__.__name__ 或模块路径,可区分 Jupyter 与普通 IPython 终端(如 QtConsole)

示例代码:

def is_running_in_jupyter():
    try:
        from IPython import get_ipython
        ipython = get_ipython()
        if ipython is None:
            return False
        # 检查是否为 Jupyter 内核(而非 IPython 终端)
        return 'ZMQInteractiveSh

ell' in str(type(ipython)) except ImportError: return False except NameError: return False

if is_running_in_jupyter(): print("正在 Jupyter 环境中运行") else: print("不在 Jupyter 环境中")

方法二:检查环境变量 JUPYTER_ENVJPY_PARENT_PID

Jupyter 启动时通常会设置一些进程级环境变量,其中较稳定的是 JPY_PARENT_PID(Jupyter Python Parent PID),它在 notebook kernel 启动时被注入:

  • 该变量存在且非空,大概率说明运行在 Jupyter kernel 中
  • 注意:它也可能出现在 JupyterLab 扩展或某些嵌入式场景中,但误判率较低

示例:

import os
is_jupyter = 'JPY_PARENT_PID' in os.environ and os.environ['JPY_PARENT_PID'].isdigit()

方法三:结合多种信号提高鲁棒性

单一判断可能有边界情况(例如某些定制内核或测试 mock 环境),推荐组合使用:

  • 先尝试 get_ipython() + 类型校验(主依据)
  • 再 fallback 到 JPY_PARENT_PID 环境变量(辅助验证)
  • 避免依赖 sys.argv 或工作目录等易变特征

这样能覆盖 notebook、lab、colab、kaggle notebook 等主流场景,同时对本地脚本、终端 IPython、VS Code Python Interactive 窗口也能合理区分。

注意事项

不要仅靠 sys.argv[0] 是否含 "jupyter" 来判断——那是启动命令,不是当前运行上下文;也不建议依赖 __file__ 是否为 ,因为该字符串格式不稳定且可能被覆盖。