Problem mit carriage return

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
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

Ich hab ein problem mit carriage return "\r" in python 2.4, läuft auf linux.
Tritt allerdings nicht immer auf.

In diesem Fall wird die Ausgabe nicht überschrieben, entferne ich den letzten Beistrich im print befehl nicht, gibt es überhaupt keine Ausgabe:
(Um das Programm schnell zu erklären: der serielle CTS-Eingang wird überwacht, bei "True" wird die Zeit bestimmt und die Differenz zur letzten Zeitmessung gebildet ... Ausgegeben wird die Frequenz, wenn sie sich in gewissen Grenzen befindet)

Code: Alles auswählen

import serial
import time
ser=serial.Serial()
ser.port="/dev/ttyUSB0"
ser.open()

before=0
time_before=time.time()

while True:
        if ser.getCTS()==True:
                now=time.time()
                diff=now-before
                before=now
                if bool(diff<1.5) & bool(diff>0.15) & bool(now>=(time_before+1)):
                        print int(60./diff),"\r",
                        time_before=now
Ein einfaches Testprogramm in dieser Art funktionert aber sehr wohl:

Code: Alles auswählen

while True:
      print "test","\r",
Er schreibt einfach "test" immer an die selbe Stelle.

Wo liegt der Unterschied und wie bekomme ich Programm #1 dazu die Ausgabe zu überschreiben?
BlackJack

Bei Deinem zweiten Quelltext sieht man nicht wann die einzelnen 'test' geschrieben werden. Die Ausgabe ist normalerweise gepuffert und wird erst rausgeschrieben, wenn der Puffer voll ist. Am besten macht man die Ausgabe über `sys.stdout` und benutzt die `flush()`-Methode um sofortiges rausschreiben zu forcieren.

Code: Alles auswählen

while True:
    if ser.getCTS():
        now = time.time()
        diff = now - before
        before = now
        if 0.15 < diff < 1.5 and now >= (time_before + 1):
            sys.stdout.write('%i\r' % int(60 / diff))
            sys.stdout.flush()
            time_before = now
Wo hast Du diese eigenartige `bool()` und ``&``-Kombination her? Logische Verknüpfungen werden in Python mit ``and`` und ``or`` gemacht. ``&`` und ``|`` sind bitweise Verknüpfungen.
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

hehe, wo ich die her hab? Ich steh ziemlich am Anfang meiner Python Karriere. Das ist vielleicht mein 10tes Programm. & war das einzige AND, dass ich kannte. und irgendwie musste ich doch die Beschränkung umgehen, dass damit nur boolsche Werte verküpft werden können. Ist aber besser als 3 IF-Schleifen ineinander, was ich zu Beginn gemacht habe. :D

Danke für die Hilfestellung und auch für die anderen Anregungen.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

"if-Schleifen", wie? ;)
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

ok, if-Anweisung.

interessant, wenn ich die "test"-schleife mit time.sleep() bremse erkenne ich, dass wirklich erst geschrieben wird, wenn der Puffer voll ist.

enhält "\n", die ja scheinbar bei print impliziert wird auch die Anweisung den Puffer zu leeren?
BlackJack

Es gibt für Dateien drei verschiedene Modi: Block-Puffer, ungepuffert und Zeilengepuffert. Wenn man eine Datei selbst öffnet kann man das mit dem dritten Argument selbst festlegen (0=ungepuffert, 1=Zeilenpuffer, andere Werte=Puffergrösse).

Die Standardausgabe benutzt meistens einen Zeilenpuffer, wenn sie mit einem Terminal verbunden ist, und Block-Puffer sonst.
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

alles klar.
Antworten