# Ptyprocess — Ptyprocess 0.7 documentation ## Metadata | Field | Value | |---|---| | Institute | Molodetz Institute — Research & Retrieval Division | | Subject | async-pty-process-testing | | Document type | Source Dossier | | Tier | 1 | | Source title | Ptyprocess — Ptyprocess 0.7 documentation | | Source URL | https://ptyprocess.readthedocs.io/en/latest/ | | Source publisher / author | ptyprocess maintainers (readthedocs project) | | Source type | vendor docs | | Source date (published) | Unknown — not stated | | Date researched | 2026-10-09 | | Researched by | tai (agent), model: Claude Sonnet 5, on behalf of retoor | | Research method | web search synthesis | | Confidence | Medium | | Status | Active | ## Summary Ptyprocess is a Python library for spawning a child process attached to a real pseudo-terminal (pty) rather than plain pipes. Its documentation describes the behavioral guarantees a real pty gives you that a pipe cannot: unified stdio, window-size tracking with SIGWINCH delivery, and line-discipline signal generation (Ctrl-C becomes SIGINT). ## Key findings - When a program runs under ptyprocess, all three of its standard streams (stdin/stdout/stderr) are connected to a single pty, not three separate pipes. - Ptyprocess tracks the terminal's window size and notifies the child process with a SIGWINCH signal when it changes. - In cooked (line-buffered) terminal mode, the kernel's tty line discipline turns a Ctrl-C keystroke (byte 0x03) into a SIGINT delivered to the foreground process group — this only happens because the device is a real pty, not a pipe. ## Pros / strengths - Documents, in one place, exactly which "feels like a real terminal" behaviors a pty provides that a pipe does not — this is the core justification for why `tai_test.py` needed pty support at all, since `tai.py`'s own code branches on `sys.stdin.isatty()`. - The SIGWINCH and line-discipline-SIGINT points are concrete, testable claims, not vague marketing. ## Cons / limitations / caveats - The dossier is based on a web-search synthesis of the documentation, not a full read of the library's source or a hands-on trial of ptyprocess itself — `tai_test.py` does not depend on ptyprocess as a library, only on the general pty behavior it documents (which was reimplemented directly against the stdlib `pty` module). - Says nothing about asyncio integration; ptyprocess itself is a synchronous/blocking library. ## Relevance to tai Directly informed the decision to give `tai_test.py`'s pty mode a real pseudo-terminal rather than a pipe, since `tai.py` branches on `isatty()` for approval prompts and readline behavior. The SIGWINCH/Ctrl-C-SIGINT behaviors this source describes are explicitly **not** relied on by `tai_test.py` — see the companion dossier on the `start_new_session`/controlling-terminal pitfall (`github-agents-issue1-controlling-terminal.md`) and the framework's own documented limitation in its module docstring. ## Changelog | Date | Change | |---|---| | 2026-10-09 | Initial dossier created. |