Używam modułu readline
z Pythonem 2.7.3 z Fedorą 17. Nie mam tego problemu z Ubuntu 12.10.Moduł readline Pythona drukuje znak escape podczas importowania
Podczas import readline
wyświetlany jest znak escape.
$ python -c 'import readline' |less
ESC[?1034h(END)
Zwykle kiedy się nieoczekiwane wyjście tak, ja obsługiwać go za pomocą stdout/stderr
przekierowanie do manekina deskryptor pliku (przykład poniżej). Ale tym razem ta metoda nie działa.
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'
Jeśli uruchomić ten fragment w test.py
skryptu, widać, że wewnątrz kontekstu suppress_output
, oświadczenia print
są rzeczywiście tłumione, ale nie char ucieczki.
$ python test.py |less
Begin
ESC[?1034hEnd
(END)
Więc oto moje dwa pytania:
- Jak to możliwe, postać ta ucieczka przejść przez?
- Jak to powstrzymać?
Wygląda na to, że moduł chce zmienić stan terminala za pomocą sekwencji specjalnej, ale to nie działa. Nie powinieneś próbować tego obejść, napraw to. – wRAR
Tak, istnieje sposób obejścia tego na podstawie http://reinout.vanrees.org/weblog/2009/08/14/readline-invisible-character-hack.html. Ale to nie odpowiadało na moje pierwsze pytanie :) (i bałam się, że nie był bardzo przenośny, ale mogę się mylić). – Alex
Podejrzewam, że twój terminal i/lub terminfo DB powoduje ten problem. – wRAR