2014-09-23 4 views
0

Модуль 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? Наверняка должен быть какой-то модуль, который может сделать это для меня?

+3

У вас есть два варианта: (1) написать или найти библиотеку, которая интерпретирует последовательности ANSI и преобразует строки после факта, или (2) прекратить запись символа по символу и вместо этого использовать буферизацию строк (в идеале с 'readline') и получить преобразованные данные в первую очередь. Второй вариант не всегда уместен, но когда это так, это намного проще. – abarnert

+0

Между тем, если вы запрашиваете библиотеку или утилиту, которая делает # 1, это не плохой вопрос, но это плохо подходит для SO. Это может быть полезно для [Software Recs] (http://softwarerecs.stackexchange.com), но поскольку я не часто посещаю этот сайт, не цитируйте меня на этом. – abarnert

+0

Благодарим вас за то, что вы выделили различие между SO и Software Recs. Я могу продолжить поиск там, если сегодня не сделаю никакого прогресса. Что касается вашего первого комментария, к сожалению, модуль, который я использую, не позволяет этого, поэтому у меня создается впечатление, что я должен найти утилиту, которая будет выполнять интерпретацию ANSI для меня (до сих пор [ansiterm] (https://github.com/helgefmi/ansiterm), похоже, имеет то, что мне нужно). – pleasemorebacon

ответ

1

less интерпретирует управляющие символы.

Вы можете обойти эту проблему с помощью опции линии -r команды:

$ less -r file.txt 
show myself out 

Из инструкции:

-r or --raw-control-chars 
      Causes "raw" control characters to be displayed. The default is 
      to display control characters using the caret notation; for 
      example, a control-A (octal 001) is displayed as "^A". Warning: 
      when the -r option is used, less cannot keep track of the actual 
      appearance of the screen (since this depends on how the screen 
      responds to each type of control character). Thus, various dis‐ 
      play problems may result, such as long lines being split in the 
      wrong place. 

Необработанные управляющие символы посылаются на терминал, который затем интерпретирует их как cat бы.

Как уже было сказано, вам необходимо будет интерпретировать символы перед тем, как записать их в файл.