pty.md
1> **Источник:** https://python-all.ru/3.4/library/pty.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 35.8. [`pty`](https://python-all.ru/3.4/library/pty.html#module-pty) – Утилиты псевдо-терминала89Модуль [`pty`](https://python-all.ru/3.4/library/pty.html#module-pty) определяет операции для работы с псевдо-терминалом: запуск другого процесса и программную запись и чтение его управляющего терминала.1011Поскольку работа с псевдотерминалами сильно зависит от платформы, код для этого реализован только для Linux. (Предполагается, что код для Linux будет работать и на других платформах, но это ещё не проверено.)1213Модуль [`pty`](https://python-all.ru/3.4/library/pty.html#module-pty) определяет следующие функции:1415#### `pty.fork()`1617Fork. Подключает управляющий терминал дочернего процесса к псевдо-терминалу. Возвращаемое значение – `(pid, fd)`. Обратите внимание, что дочерний процесс получает *pid* 0, а *fd* является *недействительным*. Родительский процесс получает *pid* дочернего процесса, а *fd* – это файловый дескриптор, подключённый к управляющему терминалу дочернего процесса (а также к его стандартному вводу и выводу).1819#### `pty.openpty()`2021Открывает новую пару псевдо-терминалов, используя [`os.openpty()`](https://python-all.ru/3.4/library/os.html#os.openpty), если это возможно, или код эмуляции для обычных Unix-систем. Возвращает пару файловых дескрипторов `(master, slave)`, для ведущего и ведомого концов соответственно.2223#### `pty.spawn(argv[, master_read[, stdin_read]])`2425Создаёт процесс и подключает его управляющий терминал к стандартному вводу-выводу текущего процесса. Это часто используется, чтобы обмануть программы, которые настаивают на чтении из управляющего терминала.2627Функции *master\_read* и *stdin\_read* должны читать из файлового дескриптора. По умолчанию при каждом вызове читается 1024 байта.2829Изменено в версии 3.4: [`spawn()`](https://python-all.ru/3.4/library/pty.html#pty.spawn) теперь возвращает код завершения от [`os.waitpid()`](https://python-all.ru/3.4/library/os.html#os.waitpid) для дочернего процесса.3031## 35.8.1. Пример3233Следующая программа действует как команда Unix *script(1)*, используя псевдотерминал для записи всего ввода и вывода сеанса терминала в «typescript».3435```python36import argparse37import os38import pty39import sys40import time4142parser = argparse.ArgumentParser()43parser.add_argument('-a', dest='append', action='store_true')44parser.add_argument('-p', dest='use_python', action='store_true')45parser.add_argument('filename', nargs='?', default='typescript')46options = parser.parse_args()4748shell = sys.executable if options.use_python else os.environ.get('SHELL', 'sh')49filename = options.filename50mode = 'ab' if options.append else 'wb'5152with open(filename, mode) as script:53 def read(fd):54 data = os.read(fd, 1024)55 script.write(data)56 return data5758 print('Script started, file is', filename)59 script.write(('Script started on %s\n' % time.asctime()).encode())6061 pty.spawn(shell, read)6263 script.write(('Script done on %s\n' % time.asctime()).encode())64 print('Script done, file is', filename)65```66