Spec-Zone.ru › Python 3.13

pty — Утилиты псевдотерминалов

Исходный код: Lib/pty.py

Модуль pty определяет операции для работы с концепцией псевдотерминала: запуск другого процесса и возможность программно записывать в него и читать из него данные.

Доступность: Unix.

Обработка псевдотерминалов сильно зависит от платформы. Этот код в основном тестировался на Linux, FreeBSD и macOS (предполагается, что он будет работать и на других POSIX-платформах, но он не был тщательно протестирован).

Модуль pty определяет следующие функции:

pty.fork()

Fork. Подключает управляющий терминал дочернего процесса к псевдотерминалу. Возвращаемое значение — (pid, fd). Обратите внимание, что у дочернего процесса pid равен 0, а fd — недействительно. Возвращаемое значение родительского процесса — pid дочернего процесса, а fd — дескриптор файла, подключенный к управляющему терминалу дочернего процесса (а также к стандартному вводу и выводу дочернего процесса).

Предупреждение

На macOS использование этой функции небезопасно при совместном использовании с API системного уровня более высокого уровня, включая использование urllib.request.

pty.openpty()

Открывает новую пару псевдотерминалов, используя os.openpty(), если это возможно, или код эмуляции для общих Unix-систем. Возвращает пару дескрипторов файлов (master, slave), для мастер и слав конца, соответственно.

pty.spawn(argv[, master_read[, stdin_read]])

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

Цикл копирует STDIN текущего процесса в дочерний процесс и данные, полученные от дочернего процесса, в STDOUT текущего процесса. Если STDIN текущего процесса закрывается, дочерний процесс не сигнализируется.

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

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

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

Возвращает значение возврата из os.waitpid() для дочернего процесса.

os.waitstatus_to_exitcode() может быть использован для преобразования кода возврата в код завершения.

Вызывает событие аудита 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/pty.html

Spec-Zone.ru

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