Модуль python, который я использую, обеспечивает крючок, который позволяет захватывать ввод пользовательской клавиатуры до его отправки на терминал оболочки. Проблема, с которой я сталкиваюсь, заключается в том, что она захватывает входной символ по символу, что затрудняет захват входных команд, когда пользователь выполняет такие действия, как обратная или перемещающая курсор.Запись строки с escape-последовательностями ANSI в файл
Например, если строка выход \ X1B [4D \ X1B [Jshow себя из, происходит следующее:
>>> a = exit\x1b[4D\x1b[Jshow myself out
>>> print(a)
show myself out
>>> with open('file.txt', 'w+') as f:
>>> f.write(a)
>>> exit()
less abc.txt
Чем меньше команда показывает необработанный команда (выход \ x1B [4D \ x1b [Jshow self out), когда на самом деле я хотел бы, чтобы он был «чистым», поскольку он отображается при использовании функции печати (показать себя).
Печать результата, или «cat'ing the file» показывает, что именно я хотел бы отображать, но я предполагаю, что терминал преобразует вывод.
Есть ли способ достичь «чистой» записи в файл, используя какой-либо модуль python или некоторую утилиту bash? Наверняка должен быть какой-то модуль, который может сделать это для меня?
У вас есть два варианта: (1) написать или найти библиотеку, которая интерпретирует последовательности ANSI и преобразует строки после факта, или (2) прекратить запись символа по символу и вместо этого использовать буферизацию строк (в идеале с 'readline') и получить преобразованные данные в первую очередь. Второй вариант не всегда уместен, но когда это так, это намного проще. – abarnert
Между тем, если вы запрашиваете библиотеку или утилиту, которая делает # 1, это не плохой вопрос, но это плохо подходит для SO. Это может быть полезно для [Software Recs] (http://softwarerecs.stackexchange.com), но поскольку я не часто посещаю этот сайт, не цитируйте меня на этом. – abarnert
Благодарим вас за то, что вы выделили различие между SO и Software Recs. Я могу продолжить поиск там, если сегодня не сделаю никакого прогресса. Что касается вашего первого комментария, к сожалению, модуль, который я использую, не позволяет этого, поэтому у меня создается впечатление, что я должен найти утилиту, которая будет выполнять интерпретацию ANSI для меня (до сих пор [ansiterm] (https://github.com/helgefmi/ansiterm), похоже, имеет то, что мне нужно). – pleasemorebacon