2013-10-07 11 views
5

Czy istnieje metoda drukowania sformatowanych w formacie wyjściowym terminala do zmiennej?Jak wydrukować sformatowane w terminalu dane wyjściowe do zmiennej

print 'a\bb' 
--> 'b' 

Chcę, aby ciąg "b" do zmiennej - więc jak to zrobić?

Pracuję z ciągiem tekstowym z telnetu. Dlatego chcę pracować z ciągiem, który zostanie wydrukowany na ekranie.

Więc co szukam jest coś takiego:

simplify_string('a\bb') ==> 'b' 

Innym przykładem z powrotu karetki:

simplify_string('aaaaaaa\rbb') ==> 'bbaaaaa' 
+0

Wszystkim, którzy publikują metody, aby po prostu uchwycić standardowe wyjście: brakuje ci sensu. Problem polega na uproszczeniu łańcucha w celu uwzględnienia * znaków sterujących terminalu *, a nie tylko przechwytywania 'sys.stdout'. – nneonneo

+1

@nneonneo: jaki jest przykład, w którym przechwytywanie standardowego wyjścia nie ma wpływu na takie znaki? –

+1

@DavidRobinson: każdy przypadek. Chce "\ b" faktycznie ** usunąć poprzedni znak **, skutecznie emulując zachowanie '\ b', ponieważ wpłynęłoby to na faktyczny terminal. Przechwytywanie 'sys.stdout' nie emuluje terminala, po prostu przechwytuje bezpośrednio wszystkie i wszystkie sekwencje kontrolne. – nneonneo

Odpowiedz

7

Ten okazuje się być dość trudne, ponieważ istnieje dużo poleceń formatowania terminali (w tym np. poleceń góra/dół/lewo/prawo, kodów kolorów terminali, zakładek pionowych i poziomych itp.).

Tak więc, jeśli chcesz poprawnie emulować terminal, uzyskaj emulator terminalu! pyte (pip install pyte) implementuje wirtualny terminal zgodny z VT102 w pamięci. Tak, można go karmić jakiś tekst, a następnie uzyskać sformatowanego tekstu z niego:

import pyte 

screen = pyte.Screen(80, 24) 
stream = pyte.ByteStream() 
stream.attach(screen) 
stream.feed('xyzzz\by\rfoo') 
print ''.join(c.data for c in screen[0]).rstrip() 
# prints foozy 

Aby obsłużyć wiele linii, po prostu dołączyć wszystkie linie w tekście (np '\n'.join(''.join(c.data for c in row).rstrip() for row in screen).rstrip('\n')).

Należy zauważyć, że nie obsługuje to spacji końcowych, ale i tak byłyby one nie do odróżnienia na prawdziwym terminalu.

+0

Byłem tylko emulatorem terminala google dla Pythona :) Dobra robota! – BartoszKP

+0

Ten wydaje się działać! – mkorpela

Powiązane problemy