使用Python连接运行中Jupyter内核失败的技术求助
解决Jupyter KernelClient连接报错TypeError: object() takes no parameters
我帮你排查了这个问题,根源在于你用错了客户端类——KernelClient本身是个抽象基类,它只定义了接口规范,没有实现具体的通道逻辑,直接实例化调用会触发你看到的错误。下面是正确的解决方案:
正确的操作步骤
1. 使用具体的客户端子类
你需要用jupyter_client提供的具体实现类,比如适合同步操作的BlockingKernelClient:
from jupyter_client import BlockingKernelClient
2. 加载连接信息并启动通道
用你获取到的连接信息配置客户端,然后启动通信通道:
# 你的连接信息 connection = { "signature_scheme": "hmac-sha256", "shell_port": 49545, "kernel_name": "", "iopub_port": 49546, "stdin_port": 49547, "hb_port": 49549, "control_port": 49548, "key": "1a359267-f30d84302c39d352d6ac17c3", "transport": "tcp", "ip": "127.0.0.1" } # 实例化BlockingKernelClient client = BlockingKernelClient() # 加载连接配置 client.load_connection_info(connection) # 启动所有通信通道 client.start_channels()
3. 测试代码执行
现在你可以正常提交代码执行并获取结果了:
# 执行测试代码 msg_id = client.execute('print("Hello World")') # 监听并获取执行输出 while True: msg = client.get_iopub_msg() # 匹配当前执行请求的消息ID if msg['parent_header'].get('msg_id') == msg_id: # 打印输出内容 if 'text' in msg.get('content', {}): print(msg['content']['text']) # 收到执行完成的回复后退出循环 if msg['msg_type'] == 'execute_reply': break
错误原因解释
KernelClient作为抽象基类,它的shell_channel等属性并没有被具体实现。当你尝试调用start_channels()或execute()时,内部会尝试创建通道实例,但抽象类里的通道实现只是一个空的object,导致触发TypeError: object() takes no parameters。而BlockingKernelClient是KernelClient的具体子类,它实现了所有必要的TCP通道逻辑,能正常和Jupyter内核通信。
如果你的场景需要异步操作,也可以使用AsyncKernelClient,但对于脚本式的原型实验,BlockingKernelClient是最直观易用的选择。
内容的提问来源于stack exchange,提问作者SciGuyMcQ
相关产品推荐
相关产品推荐

