Я использую модуль readline
с Python 2.7.3 с Fedora 17. У меня нет этой проблемы с Ubuntu 12.10.Модуль Readline Python печатает escape-символ во время импорта
В течение import readline
отображается символ возврата.
$ python -c 'import readline' |less
ESC[?1034h(END)
Обычно, когда я получаю неожиданный выход, как это, я обрабатывать его с помощью stdout/stderr
редиректа фиктивного дескриптора файла (например, ниже). Но на этот раз этот метод не работает.
import sys
class DummyOutput(object):
def write(self, string):
pass
class suppress_output(object):
"""Context suppressing stdout/stderr output.
"""
def __init__(self):
pass
def __enter__(self):
sys.stdout = DummyOutput()
sys.stderr = DummyOutput()
def __exit__(self, *_):
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
if __name__ == '__main__':
print 'Begin'
with suppress_output():
# Those two print statements have no effect
# but *import readline* prints an escape char
print 'Before importing'
import readline
print 'After importing'
# This one will be displayed
print 'End'
Если запустить этот фрагмент в test.py
сценарии, вы увидите, что внутри suppress_output
контексте print
заявления действительно подавлено, но не бежать символ.
$ python test.py |less
Begin
ESC[?1034hEnd
(END)
Так вот мои два вопроса:
- Как это возможно, для этого маскирующим пройти через это?
- Как его подавить?
Похоже, модуль хочет изменить состояние терминала с помощью escape-последовательности, но это не сработает. Вы не должны пытаться обойти это, исправьте это. – wRAR
Да, есть обходное решение, основанное на этом http://reinout.vanrees.org/weblog/2009/08/14/readline-invisible-character-hack.html. Но это не отвечало моему первому вопросу :) (и я боялся, что это не очень портативно, но я могу ошибаться). – Alex
Я подозреваю, что ваш терминал и/или terminfo DB вызывают эту проблему. – wRAR