2013-10-07 9 views
5

Gibt es eine Methode, terminal formatierte Ausgaben auf eine Variable zu drucken?So drucken Sie terminalformatierte Ausgaben in eine Variable

Ich möchte diese Zeichenfolge 'B' zu einer Variablen - so wie es geht?

Ich arbeite mit einer Zeichenfolge aus Telnet. Daher möchte ich mit der Zeichenfolge arbeiten, die auf dem Bildschirm gedruckt werden würde.

Also, was ich suche ist so etwas wie dieses:

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

Ein anderes Beispiel mit einem Wagenrücklauf:

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

Für alle, die Methoden veröffentlichen, um nur die Standardausgabe zu erfassen: Sie verpassen den Punkt. Das Problem besteht darin, eine Zeichenfolge zu vereinfachen, die * Terminal-Steuerzeichen * berücksichtigt und nicht nur 'sys.stdout' erfasst. – nneonneo

+1

@nneonneo: Was ist ein Beispiel, bei dem das Capturen der Standardausgabe für solche Zeichen nicht möglich wäre? –

+1

@DavidRobinson: jeden Fall. Er möchte tatsächlich das vorherige Zeichen ** löschen ** und das Verhalten von '\ b' emulieren, da es sich auf ein tatsächliches Terminal auswirken würde. Das Erfassen von 'sys.stdout' emuliert kein Terminal, es erfasst nur alle Kontrollsequenzen direkt. – nneonneo

Antwort

7

Dies erweist sich als ziemlich schwierig sein, weil es eine viel von Terminal-Formatierungsbefehlen (einschließlich z. B. Cursor-hoch/runter/links/rechts-Befehle, Terminal-Farbcodes, vertikale und horizontale Tabs, etc.).

Also, wenn Sie ein Terminal richtig emulieren wollen, erhalten Sie einen Terminal-Emulator! pyte (pip install pyte) implementiert ein VT102-kompatibles virtuelles In-Memory-Terminal. So können Sie ihm etwas Text füttern, und dann bekommen den formatierten Text von ihm:

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 

Um mehrere Zeilen zu behandeln, kommt nur alle Zeilen in dem Text (z '\n'.join(''.join(c.data for c in row).rstrip() for row in screen).rstrip('\n')).

Beachten Sie, dass dies keine abschließenden Leerzeichen behandelt, aber diese wären auf einem echten Terminal sowieso nicht unterscheidbar.

+0

War nur googlen Terminal-Emulatoren für Python :) Netter Job! – BartoszKP

+0

Dieser scheint zu funktionieren! – mkorpela

Verwandte Themen