Konsole clear frage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cz3kit
User
Beiträge: 74
Registriert: Freitag 9. Januar 2009, 16:24

ich hab eine kleine Frage, und zwar ich schreiben ein kleines Programm und das ganze findet in der Konsole statt. Es gibt ja den Befehl os.system("cls"), dieser cleart den ganzen Konsole Bildschirm. Gibt es einen Befehl der auch vielleicht nur die aktuelle Zeile löscht? Wäre über einen tipp sehr dankbar.

Und eine kleine Sache noch, wie kann man den Konsolennamen ändern? Also wenn man die Konsole öffnet hat man ja pben in der Leite einen Dateipfad angegeben, kann man diesen irgendwie mit Python ändern zB auf "Hallo Welt"?

MfG cz3kit
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Mit den guten alten Steuerzeichen kannst Du das für die aktuelle Zeile erreichen:

Code: Alles auswählen

sys.stdout.write('\b') # backspace, gehe ein Zeichen zurück
sys.stdout.write('\r') # carriage return, zum Anfang der Zeile
Vorher geschriebenes ließe sich mit whitespaces "löschen". (Achtung bei Text über die Zeilenlänge.) Nach Schreibaktionen ohne newline das flush() nicht vergessen, sonst sieht evtl. nur der Puffer was von der Änderung.
Ein direktes Löschen einer anderen als der aktuellen Zeile ist im Zeilenmodus nicht möglich, da das Programm hierauf keinen Zugriff hat.

Zumindest xterm unterstützt die Angabe eines Konsolennamens, sofern der WM das auch anzeigt:

Code: Alles auswählen

xterm -title Hoppla
problembär

"cls" deutet aber auf Win/DOS hin (da geht "\r" usw. glaube ich nicht); unter Linux heißt es ja "clear".

Gruß
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Code: Alles auswählen

import sys, time

for i in ['A', 'B', 'C']:
    sys.stdout.write('\r'+ i*20)
    sys.stdout.flush()
    time.sleep(1)
print '\r'+ ' '*20
Das funktioniert sowohl unter Linux (xterm) als auch mit der WinXP-Eingabeaufforderung. Warum sollten die Steuerzeichen Deiner Meinung nach unter Win/DOS nicht funktionieren? Gerade das DOS-Terminal ist doch entwicklungsgeschichtlich näher an diesen alten Ausgabefestlegungen dran, als alle Linuxkonsolen je sein könnten (bzw. nur über vtXX-Emulation sind). Oder hat selbst hier MS sein eigenes Süppchen auf dem Feuer gehabt?
Falls Du auf die unterschiedliche Handhabung des Zeilenumbruches anspielst, macht DOS eigentlich als einziger das Richtige mit CR/LF, wenn man die Herkunft von Schreibmaschinen (bzw. Fernschreibern) bedenkt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jerch hat geschrieben:Das funktioniert sowohl unter Linux (xterm) als auch mit der WinXP-Eingabeaufforderung. Warum sollten die Steuerzeichen Deiner Meinung nach unter Win/DOS nicht funktionieren? Gerade das DOS-Terminal ist doch entwicklungsgeschichtlich näher an diesen alten Ausgabefestlegungen dran, als alle Linuxkonsolen je sein könnten
Nein, die Linuxkonsolen emulieren idR ein VT100, damit sind die entwicklungsgeschichlich relativ alt (siehe diesen Tollen Artikel) wohingegen das "DOS-Fenster" in Windows NT und aufwährts eigentlich kein DOS-Fenster ist, und das versteht nicht mal die ANSI Farb-Sequenzen die DOS und Windows 9x noch konnten.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Leonidas:
Da hast Du mich mißverstanden. Ich bezog das entwicklungsgeschichtlich alt nicht auf die "moderneren" Konsolenfeatures wie farbige Ausgabe, sondern auf die Urspezifikation aus den 60iger (ISO und ASA). DOS hat hier viel von CP/M (frühe 70iger) geerbt, und Zeichen wie \r versteht auch der DOS-Emulator unter NT noch. Und die VT100 ist ja erst gegen Ende der 70iger eingesetzt wurden und gehörte schon zu einer neuen intelligenteren Generation (mit welchen dann auch die ANSI-Escape-Sequenzen Einzug erhielten).

Etwas offtopic, aber bei der Gelegenheit mußte ich gleich an den Urvater der GUI denken: Douglas Engelbart. Nicht zu fassen, das der Mann schon in den 50igern mit der Idee schwanger ging.
cz3kit
User
Beiträge: 74
Registriert: Freitag 9. Januar 2009, 16:24

Code: Alles auswählen

import sys, time

for i in ['A', 'B', 'C']:
    sys.stdout.write('\r'+ i*20)
    sys.stdout.flush()
    time.sleep(1)
print '\r'+ ' '*20
ich werde es mal damit veruschen

danke
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

cz3kit hat geschrieben:Und eine kleine Sache noch, wie kann man den Konsolennamen ändern? Also wenn man die Konsole öffnet hat man ja pben in der Leite einen Dateipfad angegeben, kann man diesen irgendwie mit Python ändern zB auf "Hallo Welt"?
Wenn ich das richtig gesehen habe ist keiner darauf eingegangen.
Den Title der DOS-Box kannst du so ändern:

Code: Alles auswählen

Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system("TITLE Hallo Welt")
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

...wobei man natürlich statt zu `os.system()` zu `subprocess.Popen()` greifen sollte...

Vielleicht sollte Python das mal irgendwann als "deprecated" kennzeichnen. Ich kenne keinen Vorteil - außer der Abwärtskompatibilität -, der für `os.sytem()` spricht.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

system() ist wie viele andere Funktionen in os nur ein Wrapper um die entsprechende C-Library-Funktion, und als solches wird es sicher nicht deprecated. Und für viele Skripte reicht es auch völlig aus, system() zu verwenden, und nicht sich mit subprocess herumschlagen zu müssen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
cz3kit
User
Beiträge: 74
Registriert: Freitag 9. Januar 2009, 16:24

oh danke Zap dsa find ich cool :P

vielen Dank für die Hilfe
lunar

birkenfeld hat geschrieben:system() ist wie viele andere Funktionen in os nur ein Wrapper um die entsprechende C-Library-Funktion, und als solches wird es sicher nicht deprecated. Und für viele Skripte reicht es auch völlig aus, system() zu verwenden, und nicht sich mit subprocess herumschlagen zu müssen.
Eigentlich muss man sich doch eher mit "os.system()" rumschlagen ... da muss man Eingaben maskieren, den Rückgabewert prüfen und Aufrufe über Stringkonkatenation zusammenstöpseln. Und wehe, man muss dann doch auf die Ausgabe des Prozesses zugreifen ... ich weiß nicht, aber ich finde "subprocess.checked_call()" doch irgendwie viel bequemer ;)
Antworten