Содержание страницы
34.8. pty – Утилиты псевдотерминалов¶pty – Pseudo-terminal utilities
Модуль 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 байта.
34.8.1. Пример¶Example
Следующая программа действует как команда Unix script(1), используя псевдотерминал для записи всего ввода и вывода сеанса терминала в «typescript».
import sys, os, time, getopt
import pty
mode = 'wb'
shell = 'sh'
filename = 'typescript'
if 'SHELL' in os.environ:
shell = os.environ['SHELL']
try:
opts, args = getopt.getopt(sys.argv[1:], 'ap')
except getopt.error as msg:
print('%s: %s' % (sys.argv[0], msg))
sys.exit(2)
for opt, arg in opts:
# опция -a: добавление в файл typescript
if opt == '-a':
mode = 'ab'
# опция -p: использовать оболочку Python в качестве команды терминала
elif opt == '-p':
shell = sys.executable
if args:
filename = args[0]
script = open(filename, mode)
def read(fd):
data = os.read(fd, 1024)
script.write(data)
return data
sys.stdout.write('Script started, file is %s\n' % 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())
sys.stdout.write('Script done, file is %s\n' % filename)