pty
— Псевдо-терминальные утилиты¶
Исходный код: Lib/pty.py
Модуль pty
определяет операции для обработки концепции псевдотерминала:
запуск другого процесса и возможность записи и чтения с управляющего терминала
программно.
Поскольку обработка псевдотерминалов сильно зависит от платформы, выполнение кода работает только в Linux. (Linux код, как предполагается, работает над другими платформами, но еще не был проверен.)
Модуль pty
определяет следующие функции:
-
pty.
fork
()¶ Вилка. Подключите управляющий терминал дочернего устройства к псевдотерминалу. Возвращаемое значение -
(pid, fd)
. Обратите внимание, что ребенок получает pid 0 и fd - invalid. Родительский возвращает значение pid дочернего элемента, а fd - это файл дескриптор, подключенный к управляющему терминалу дочернего элемента (а также к стандартному входу и выходу дочернего элемента).
-
pty.
openpty
()¶ Открыть новую псевдотерминальную пару, используя по возможности
os.openpty()
или эмуляцию код для универсальных Unix-систем. Возвращает пару файловых дескрипторов(master, slave)
для ведущего и ведомого конца соответственно.
-
pty.
spawn
(argv[, master_read[, stdin_read]])¶ Создайть процесс и подключить его управляющий терминал к стандартному io текущего процесса. Это часто - используемый, чтобы расстроить программы, которые настаивают на том, чтобы говорить от терминала управления. Ожидается, что процесс, порожденный позади имущества, в конечном счете закончится, и когда это сделает spawn, будет возвращает.
Функции, которые master_read и stdin_read переданы файл дескриптор, который они должны прочитать от, и они всегда должны возвращает байт строка. Чтобы вызвать икру к возвращает, прежде чем дочерний процесс выйдет,
OSError
должен быть брошен.Реализация по умолчанию для обеих функций будет считывать и возвращает до 1024 байт при каждом вызове функции. master_read колбэк передан основной файл псевдотерминала дескриптор, чтобы прочитать продукцию от дочернего процесса, и stdin_read - переданный файл дескриптор 0, чтобы читать от стандартного входа родительского процесса.
Возвращение пустого байта строка от любого, колбэк интерпретируется как условие конца файла (EOF), и что колбэк не назовут после этого. Если stdin_read сигнализирует EOF, управляющий терминал больше не может взаимодействовать с родительским процессом иЛИ дочерним процессом. Если дочерний процесс не уйдет ни без какого входа, spawn тогда образует петли навсегда. Если master_read сигнализирует об одном и том же поведении EOF (по крайней мере в Linux).
Если оба, колбэки сигнализируют о EOF тогда spawn, будут, вероятно, никогда возвращает, если select не бросит ошибку на вашу платформу, когда передано три пустых списка. Это ошибка, задокументированная в issue 26228.
Raises an auditing event
pty.spawn
with argumentargv
.Изменено в версии 3.4:
spawn()
теперь возвращает статус значение отos.waitpid()
на дочернем процессе.
Пример¶
Следующая программа аналогична Unix команде script(1), используя псевдотерминал, чтобы сделать запись всего входа и выхода предельной сессии в «typescript».
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)