pty.md
1> **Источник:** https://python-all.ru/3.15/library/pty.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `pty` – Утилиты псевдотерминалов89**Исходный код:** [Lib/pty.py](https://python-all.ru/src/3.15/Lib/pty.py)1011---1213Модуль `pty` определяет операции для работы с концепцией псевдотерминала: запуск другого процесса и возможность программно записывать и читать из его управляющего терминала.1415[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix.1617Работа с псевдотерминалами сильно зависит от платформы. Данный код в основном тестировался на Linux, FreeBSD и macOS (предполагается, что он работает на других POSIX-платформах, но тщательного тестирования не проводилось).1819Модуль `pty` определяет следующие функции:2021#### `pty.fork()`2223Создаёт процесс. Подключает управляющий терминал дочернего процесса к псевдотерминалу. Возвращаемое значение – `(pid, fd)`. Обратите внимание, что дочерний процесс получает *pid* равным 0, а *fd* является *недействительным*. Родительский процесс возвращает *pid* дочернего процесса, а *fd* – это файловый дескриптор, подключённый к управляющему терминалу дочернего процесса (а также к его стандартному вводу и выводу).2425Возвращаемый файловый дескриптор *fd* является [ненаследуемым](https://python-all.ru/3.15/library/os.html#fd-inheritance).2627> **Предупреждение**28>29> В macOS использование этой функции небезопасно в сочетании с высокоуровневыми системными API, в том числе с [`urllib.request`](https://python-all.ru/3.15/library/urllib.request.html#module-urllib.request).3031Изменено в версии 3.15: Возвращаемый файловый дескриптор теперь стал ненаследуемым.3233#### `pty.openpty()`3435Открывает новую пару псевдотерминалов, используя [`os.openpty()`](https://python-all.ru/3.15/library/os.html#os.openpty), если возможно, или код эмуляции для стандартных Unix-систем. Возвращает пару файловых дескрипторов `(master, slave)`, для ведущего и ведомого конца соответственно.3637#### `pty.spawn(argv[, master_read[, stdin_read]])`3839Создаёт процесс и подключает его управляющий терминал к стандартному вводу-выводу текущего процесса. Это часто используется для обмана программ, которые требуют чтения с управляющего терминала. Ожидается, что процесс, запущенный в pty, в конце концов завершится, и тогда *spawn* вернёт управление.4041Цикл копирует STDIN текущего процесса в дочерний процесс и данные, полученные от дочернего процесса, в STDOUT текущего процесса. Дочернему процессу не сообщается, если STDIN текущего процесса закрывается.4243Функциям *master\_read* и *stdin\_read* передаётся файловый дескриптор, из которого они должны читать, и они всегда должны возвращать байтовую строку. Чтобы заставить spawn вернуться до завершения дочернего процесса, следует вернуть пустой байтовый массив для сигнализации конца файла.4445Реализация по умолчанию для обеих функций читает и возвращает до 1024 байт при каждом вызове. Колбэку *master\_read* передаётся ведущий файловый дескриптор псевдотерминала для чтения вывода дочернего процесса, а *stdin\_read* передаётся файловый дескриптор 0 для чтения из стандартного ввода родительского процесса.4647Возврат пустой байтовой строки из любого колбэка интерпретируется как условие конца файла (EOF), и после этого колбэк вызываться не будет. Если *stdin\_read* сигнализирует EOF, управляющий терминал больше не может взаимодействовать ни с родительским процессом, ни с дочерним. Если дочерний процесс не завершится без ввода, *spawn* будет циклически ожидать вечно. Если *master\_read* сигнализирует EOF, поведение будет таким же (по крайней мере, в Linux).4849Возвращает значение статуса выхода от [`os.waitpid()`](https://python-all.ru/3.15/library/os.html#os.waitpid) для дочернего процесса.5051[`os.waitstatus_to_exitcode()`](https://python-all.ru/3.15/library/os.html#os.waitstatus_to_exitcode) можно использовать для преобразования статуса выхода в код возврата.5253Вызывает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `pty.spawn` с аргументом `argv`.5455Изменено в версии 3.4: `spawn()` теперь возвращает значение статуса от [`os.waitpid()`](https://python-all.ru/3.15/library/os.html#os.waitpid) для дочернего процесса.5657## Пример5859Следующая программа действует как команда Unix *[script(1)](https://python-all.ru/3.15/library/pty.html)*, используя псевдотерминал для записи всего ввода и вывода терминальной сессии в «typescript».6061```python62import argparse63import os64import pty65import sys66import time6768parser = argparse.ArgumentParser()69parser.add_argument('-a', dest='append', action='store_true')70parser.add_argument('-p', dest='use_python', action='store_true')71parser.add_argument('filename', nargs='?', default='typescript')72options = parser.parse_args()7374shell = sys.executable if options.use_python else os.environ.get('SHELL', 'sh')75filename = options.filename76mode = 'ab' if options.append else 'wb'7778with open(filename, mode) as script:79 def read(fd):80 data = os.read(fd, 1024)81 script.write(data)82 return data8384 print('Script started, file is', filename)85 script.write(('Script started on %s\n' % time.asctime()).encode())8687 pty.spawn(shell, read)8889 script.write(('Script done on %s\n' % time.asctime()).encode())90 print('Script done, file is', filename)91```92