Spec-Zone.ru › Python 3.8

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]])

Запускает процесс и подключает его управляющий терминал к стандартному вводу/выводу текущего процесса. Это часто используется для обхода программ, которые настаивают на чтении из управляющего терминала. Ожидается, что процесс, запущенный через pty, в конечном итоге завершится, и когда это произойдет, spawn вернет значение.

Функциям master_read и stdin_read передается дескриптор файла, из которого они должны читать, и они всегда должны возвращать строку байтов. Для того, чтобы заставить spawn вернуть значение до завершения дочернего процесса, необходимо бросить OSError.

В реализации по умолчанию для обеих функций считывается и возвращается до 1024 байтов каждый раз при вызове функции. Обратно вызываемой функции master_read передается мастер-дескриптор файла псевдотерминала для чтения вывода дочернего процесса, а stdin_read передается дескриптор файла 0 для чтения из стандартного ввода родительского процесса.

Возврат пустой строки байтов из любого из этих обратных вызовов интерпретируется как условие конца файла (EOF), и после этого этот обратный вызов больше не будет вызываться. Если stdin_read сообщает об EOF, управляющий терминал больше не может взаимодействовать с родительским процессом ИЛИ дочерним процессом. Если дочерний процесс не завершится без ввода, spawn будет зацикливаться бесконечно. Если master_read сообщает об EOF, то возникает аналогичное поведение (по крайней мере, в Linux).

Если оба обратных вызова сообщают об EOF, то spawn, вероятно, никогда не вернется, если только select не выдаст ошибку на вашей платформе, когда ему переданы три пустых списка. Это ошибка, документированная в issue 26228.

Вызывает событие аудита pty.spawn с аргументом argv.

Изменено в версии 3.4: spawn() теперь возвращает значение статуса из os.waitpid() дочернего процесса.

Пример

Следующая программа ведет себя как команда 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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/pty.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API