Как игнорировать символы с помощью модуля python pty? - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу написать программу командной строки, которая взаимодействует с другими интерактивными программами через псевдо-терминал.В частности, я хочу иметь возможность заставить нажатия клавиш, полученные на условно , отправляться базовому процессу.Скажем для примера, что я хотел бы молча игнорировать любые отправляемые символы «е».

Я знаю, что в Python есть модуль pty для работы с псевдотерминалами иУ меня есть базовая версия моей программы, работающая с ее использованием:

import os
import pty

def script_read(stdin):
    data = os.read(stdin, 1024)

    if data == b"e":
        return ... # What goes here?
    return data

pty.spawn(["bash"], script_read)

Из экспериментов я знаю, что возвращение пустого байтового объекта b"" заставляет реализацию pty.spawn думать, что базовый дескриптор файла достигконец файла и больше не должен считываться, что приводит к тому, что терминал перестает отвечать на запросы (мне пришлось убить мой эмулятор терминала!).

1 Ответ

0 голосов
/ 23 февраля 2019

Для интерактивного использования самый простой способ сделать это, вероятно, просто вернуть объект байтов, содержащий один нулевой байт: b"\0".Эмулятор терминала ничего не печатает для него, и поэтому будет выглядеть, что этот ввод просто полностью игнорируется.

Это, вероятно, не подходит для некоторых случаев использования псевдотерминалов.В частности, если содержимое, записанное в псевдотерминал, будет снова записано присоединенной программой, это, вероятно, приведет к появлению в файле случайных нулевых байтов.При проверке с cat в качестве присоединенной программы последовательность ^@ выводится на терминал всякий раз, когда ему отправляется нулевой байт.

Итак, YMMV.

Более правильное решение будетбыть для создания типа оболочки, который может маскироваться под пустую строку для целей os.write, но в булевом контексте он будет оцениваться как "правдивый", чтобы не вызывать условное окончание файла.Я экспериментировал с этим и не мог понять, что нужно подделать, чтобы os.write полностью принял обертку как строковый тип.Мне неясно, возможно ли это вообще.: (

Вот моя первоначальная попытка создания такого типа оболочки:

class EmptyBytes():
    def __init__(self):
        self.sliced = False

    def __class__(self):
        return type(b"")

    def __getitem__(self, _key):
        return b""
...