自定义Jupyter Kernel陷入无限重启循环,请求协助排查
检查Kernel的连接配置生成逻辑
自定义Kernel必须正确处理Notebook传递的--connection-file参数,读取其中的ip、port、key、signature_scheme等配置来初始化WebSocket服务。命令行测试可能跳过了这一步,导致Notebook无法建立连接。确保你的入口脚本包含类似逻辑:import argparse import json parser = argparse.ArgumentParser() parser.add_argument('--connection-file', type=str) args = parser.parse_args() if args.connection_file: with open(args.connection_file, 'r') as f: conn_info = json.load(f) # 基于conn_info配置WebSocket服务端确认WebSocket服务端符合Jupyter协议规范
你的Kernel需要正确实现tornado.websocket.WebSocketHandler,并处理kernel_info_request等核心消息类型。同时要确保服务端绑定了connection.json中指定的IP和端口:如果是localhost/127.0.0.1,需保证Kernel与Notebook在同一主机;如果是0.0.0.0,要检查防火墙是否拦截了对应端口。排查tornado版本适配细节
即使降级到5.1.1,也要确认Kernel代码适配该版本的tornado API。比如tornado.web.Application的初始化方式、WebSocketHandler的open/on_message方法是否符合版本要求。可以在Kernel启动时打印版本验证环境:import tornado print(f"Tornado version: {tornado.version}")查看Notebook端Debug日志
启动Notebook时开启debug模式,获取WebSocket连接失败的具体原因:jupyter notebook --debug重点关注日志中关于连接超时、握手失败、签名不匹配等错误信息,这能直接定位问题根源。
验证消息签名逻辑
Jupyter要求消息必须用connection.json中的key和signature_scheme签名,Notebook端会验证签名,不匹配会直接断开连接。确保你的Kernel实现了正确的签名逻辑,示例如下(以hmac-sha256为例):import hmac import hashlib def sign_message(message, key, signature_scheme): if signature_scheme.startswith('hmac-'): digest = signature_scheme.split('-')[1] h = hmac.new(key.encode(), message, getattr(hashlib, digest)) return h.hexdigest()
内容的提问来源于stack exchange,提问作者roger

