PTY 会创建伪终端会话,适合需要终端行为的工具,例如彩色输出、Shell、交互式命令或依赖 TTY 判断的 CLI。
创建 PTY 会话
TypeScript 示例:
import { Sandbox } from "e2b";
const sandbox = await Sandbox.create("code-interpreter-v1", {
apiKey: process.env.E2B_API_KEY,
apiUrl: process.env.E2B_API_URL,
domain: process.env.E2B_DOMAIN,
});
try {
const terminal = await sandbox.pty.create({
cols: 80,
rows: 24,
timeoutMs: 0,
onData: (data) => {
process.stdout.write(data);
},
});
await sandbox.pty.sendInput(
terminal.pid,
new TextEncoder().encode("python3 - <<'PY'\nimport sys\nprint(sys.stdout.isatty())\nPY\n")
);
await sandbox.pty.sendInput(terminal.pid, new TextEncoder().encode("exit\n"));
const result = await terminal.wait();
console.log(result.exitCode);
} finally {
await sandbox.kill();
}Python 示例:
import os
from e2b import PtySize, Sandbox
sandbox = Sandbox.create(
"code-interpreter-v1",
api_key=os.environ["E2B_API_KEY"],
api_url=os.environ["E2B_API_URL"],
domain=os.environ["E2B_DOMAIN"],
)
try:
terminal = sandbox.pty.create(
PtySize(rows=24, cols=80),
timeout=0,
)
sandbox.pty.send_stdin(
terminal.pid,
b"python3 - <<'PY'\nimport sys\nprint(sys.stdout.isatty())\nPY\n",
)
sandbox.pty.send_stdin(terminal.pid, b"exit\n")
result = terminal.wait(
on_pty=lambda data: print(data.decode(), end=""),
)
print(result.exit_code)
finally:
sandbox.kill()sandbox.pty.create() 会启动交互式终端会话。TypeScript 使用 sandbox.pty.sendInput() 发送输入,Python 使用 sandbox.pty.send_stdin() 发送输入;通过 terminal.wait() 等待会话退出。需要断开后重连时,保存 terminal.pid,再使用 sandbox.pty.connect(pid)。
调整和终止 PTY
终端窗口大小变化时,调用 resize
TypeScript:
sandbox.pty.resize(pid, { cols, rows })。Python:
sandbox.pty.resize(pid, PtySize(rows, cols))
需要终止 PTY 会话时,调用
sandbox.pty.kill(pid)或会话对象的kill()。PTY 的输入输出走终端数据流,不适合依赖严格 stdout/stderr 分离的任务。
何时使用 PTY
适合使用 PTY 的场景:
需要模拟真实终端行为的命令。
工具在非 TTY 环境下会关闭颜色、进度或交互能力。
需要给交互式进程发送标准输入。
不建议使用 PTY 的场景:
只需要稳定解析 stdout/stderr 的批处理命令。
需要严格区分 stdout 和 stderr 的任务。
大量结构化日志输出场景。PTY 可能改变输出格式,增加解析成本。
默认情况下,优先使用普通 commands.run()。只有命令明确依赖终端行为时,再使用 sandbox.pty。
该文章对您有帮助吗?