pty — Утилиты псевдотерминалов
Исходный код: Lib/pty.py
Модуль pty определяет операции для работы с концепцией псевдотерминала: запуск другого процесса и возможность программного доступа для записи и чтения из его контролирующей терминальной программы.
Поскольку обработка псевдотерминалов сильно зависит от платформы, существует код для этого только для Linux. (Код для Linux должен работать на других платформах, но пока не тестировался.)
Модуль pty определяет следующие функции:
-
pty.fork() -
Fork. Подключает контролирующий терминал дочернего процесса к псевдотерминалу. Значение возврата —
(pid, fd). Обратите внимание, что у дочернего процесса pid равен 0, а fd — недействителен. Значение возврата для родительского процесса — pid дочернего процесса, а fd — дескриптор файла, подключенный к контролирующему терминалу дочернего процесса (а также к стандартному вводу и выводу дочернего процесса).
-
pty.openpty() -
Открывает новую пару псевдотерминалов, используя
os.openpty(), если это возможно, или код эмуляции для общих Unix-систем. Возвращает пару дескрипторов файлов(master, slave), для ведущего и ведомого концов, соответственно.
-
pty.spawn(argv[, master_read[, stdin_read]]) -
Запускает процесс и подключает его контролирующий терминал к стандартному вводу/выводу текущего процесса. Это часто используется для обхода программ, которые настаивают на чтении из контролирующего терминала.
Функции master_read и stdin_read должны быть функциями, читающими из дескриптора файла. Значения по умолчанию пытаются прочитать по 1024 байта каждый раз, когда они вызываются.
Изменено в версии 3.4:
spawn()теперь возвращает значение состояния изos.waitpid()для дочернего процесса.
1. Пример
Следующая программа работает как команда Unix script(1), используя псевдотерминал для записи всего ввода и вывода сессии терминала в «типографский текст».
import argparse
import os
import pty
import sys
import time
parser = argparse.ArgumentParser()
parser.add_argument('-a', dest='append', action='store_true')
parser.add_argument('-p', dest='use_python', action='store_true')
parser.add_argument('filename', nargs='?', default='typescript')
options = parser.parse_args()
shell = sys.executable if options.use_python else os.environ.get('SHELL', 'sh')
filename = options.filename
mode = 'ab' if options.append else 'wb'
with open(filename, mode) as script:
def read(fd):
data = os.read(fd, 1024)
script.write(data)
return data
print('Script started, file is', filename)
script.write(('Script started on %s\n' % time.asctime()).encode())
pty.spawn(shell, read)
script.write(('Script done on %s\n' % time.asctime()).encode())
print('Script done, file is', filename)
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/pty.html