PTY

更新时间:
复制 MD 格式

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