最可靠方法是检查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 'ZMQInteractiveShell' in str(type(ipython))
except ImportError:
return False
except NameError:
return False
if is_running_in_jupyter():
print("正在 Jupyter 环境中运行")
else:
print("不在 Jupyter 环境中")
方法二:检查环境变量 JUPYTER_ENV 或 JPY_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__ 是否为 ,因为该字符串格式不稳定且可能被覆盖。










