Spec-Zone.ru › Python 3.12

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 сигнализирует об EOF, консоль больше не может общаться с родительским процессом ИЛИ дочерним процессом. Если дочерний процесс не завершится без каких-либо входных данных, spawn будет циклиться бесконечно. Если master_read сигнализирует об EOF, результаты будут аналогичными (по крайней мере, в 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.12/library/pty.html

Spec-Zone.ru

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