如何通过HTTP请求向Jupyter终端发送命令?
如何通过HTTP/WebSocket与Jupyter终端通信
首先要明确:Jupyter终端的交互式通信不是通过普通POST请求实现的,它依赖于WebSocket协议来进行双向实时的输入输出交互。不过我们可以结合Jupyter的HTTP API和WebSocket来实现向已创建的终端发送命令的需求,下面是具体步骤:
1. 确认目标终端的信息
首先,你可以通过Jupyter的API获取所有已创建终端的详情,找到你要操作的终端(比如id为1的终端):
curl http://localhost:8888/api/terminals
返回的JSON格式大概是这样的:
[ {"name": "1", "url": "/terminals/websocket/1"} ]
这里的url字段就是该终端对应的WebSocket连接路径。
2. 建立WebSocket连接并发送命令
Jupyter终端通过WebSocket接收输入并返回输出,你需要使用WebSocket客户端工具(比如wscat,可以通过npm install -g wscat安装)来连接:
# 如果你的Jupyter设置了认证token,需要在URL后加上token参数 wscat -c ws://localhost:8888/terminals/websocket/1?token=你的认证token
连接成功后,你需要发送带换行符的stdin消息(因为终端需要回车才能执行命令),格式是JSON:
{"stdin": "ls\n"}
发送后,你会立刻收到终端返回的输出消息,格式类似:
{"stdout": "file1.py file2.txt ...\n"}
如果命令有错误输出,会收到stderr字段的消息。
补充说明
- 关于创建终端:你发现的
GET /terminals/10确实可以创建终端,但更规范的方式是用POST请求调用API:
这个请求会返回新创建终端的信息,比直接访问GET路径更可控。curl -X POST http://localhost:8888/api/terminals - 为什么不能用普通POST?因为终端是交互式的,需要实时双向通信,普通POST是单向请求-响应模式,无法满足终端的实时输入输出需求,所以Jupyter采用了WebSocket协议。
内容的提问来源于stack exchange,提问作者George Pamfilis
相关产品推荐
相关产品推荐

