Print printet nichts

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
stefan3003
User
Beiträge: 17
Registriert: Montag 27. November 2006, 11:39

Hallo,

ich habe ein Programm was für eine unbestimmte Zeit läuft, nun dachte ich mir es sei doch nett wenn auf dem Bildschirm irgendwas kleines passiert. Leichter gesagt als getan ;-| Bei folgendem Code wird leider nichts in der Konsole ausgegeben:

Code: Alles auswählen

#!/usr/bin/env python

import time

spinchars="|/-\\"
spinlen = len(spinchars)
x = 0
for i in range(600):
    if x >= spinlen:
        x = 0
    print spinchars[x],
    x=x+1
    time.sleep(0.1)
Es scheint an dem

Code: Alles auswählen

print spinchars[x],
zu liegen, wenn ich das "," entferne wird mit Newline geprintet, sieht aber nicht so toll aus. Meine eigentliche Idee war

Code: Alles auswählen

print "\r", spinchars[x],
(also ein Zeichen ohne Newline ausgeben und beim nächsten Aufruf wird es einfach gelöscht und dann überschrieben) aber wieso wird absolut garnichts ausgegeben bzw. wie mache ich es riichtig ? ;)

Vielen Dank für eure Hilfe im Vorraus,
Stefan
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

habe gerade nicht viel Zeit, also:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import time
import sys

spinchars="|/-\\"
spinlen = len(spinchars)
x = 0
for i in range(50):
    if not (x % spinlen):
        x = 0
    sys.stdout.write("%s\r" % spinchars[x])
    sys.stdout.flush()
    x += 1
    time.sleep(0.1)
oder aus einer aktuellen Anwendung von mir:

Code: Alles auswählen

def _progress_write(fraction):
    """
        writes out progress bar on the command line,
        requires fraction of the completed total

        invoke like:
        _progress_write(fraction), where fraction is a float
    """
    sys.stdout.write('    completed [')
    index = 0
    for i in xrange(20):
        if (fraction * 20) > index:
            sys.stdout.write('-')
        else:
            sys.stdout.write(' ')
        index += 1
    sys.stdout.write('] %.1f %s\r' % (fraction*100, chr(37)))
    sys.stdout.flush()
Damit solltest Du weiterbasteln können.
Viel Erfolg!

Gruß,
Christian
stefan3003
User
Beiträge: 17
Registriert: Montag 27. November 2006, 11:39

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import time
import sys

spinchars="|/-\\"
spinlen = len(spinchars)
x = 0
for i in range(50):
    if not (x % spinlen):
        x = 0
    sys.stdout.write("%s\r" % spinchars[x])
    sys.stdout.flush()
    x += 1
    time.sleep(0.1)
Super! Vielen Dank! :-) Hast du noch eine Idee warum das mit 'print' nicht geht ?

Gruß,
Stefan
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Mach mal

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import time
import sys

spinchars="|/-\\"
spinlen = len(spinchars)
x = 0
for i in range(50):
    if not (x % spinlen):
        x = 0
    time.sleep(0.1)
    print '\r',spinchars[x],
    sys.stdout.flush()
    x += 1
Na, fällt Dir was auf?

Gruß,
Christian

edit: irritierenden Nonsens entfernt
BlackJack

Etwas kürzere Variante bei der man sich nicht mit der Indexierung herumschlagen muss:

Code: Alles auswählen

import sys
import time
from itertools import cycle

def main():
    spinchars_iterator = cycle('|/-\\')
    for i in xrange(50):
        time.sleep(0.1)
        print '\r', spinchars_iterator.next(),
        sys.stdout.flush()
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Verdammt, da war BlackJack mit `cycle` schneller da ;)

Sowas ähnliches habe ich auch mal geschrieben und immer mal wieder überarbeitet. U.a. verwende ich nur soviele Rückschritte (mittels `\b`) wie erforderlich und stelle dabei auch einen Fortschrittsbalken dar. Letztlich bin ich doch überrascht, in wie wenig Code das mittlerweile zu machen ist.[/list]
stefan3003
User
Beiträge: 17
Registriert: Montag 27. November 2006, 11:39

Oh! Natürlich. Immer artig flushen nicht vergessen ;)
Vielen Dank an alle! :)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@BlackJack: Zeile 10 ist ja wohl nur nötig, wenn man in Zeile 9 in sys.stdout schreibt? Mit print statt sys.stdout.write klappt es aber in der Konsole durchaus auch.
MfG
HWK
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

HWK hat geschrieben:Zeile 10 ist ja wohl nur nötig, wenn man in Zeile 9 in sys.stdout schreibt?
Hallo HWK!

Ich glaube (will es jetzt nicht nachprüfen), dass da kein Unterschied bezüglich flush(), zwischen ``sys.stdout.write()`` und ``print``, existiert.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@Gerold: Mag sein. Bei mir funktionieren beide Varianten (print bzw. sys.stdout.write) ohne flush in der Konsole. In Idle wird natürlich nur Unsinn angezeigt.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Gerold, das ist korrekt. Das flush() ist nicht immer notwendig, aber u. U. schon. Und man will ja keine längere Rechnung ausführen, schreibt sich eine progress bar (oder so) und sieht dann bloß einen erratischen Update. Daher mag es hier überflüssig sein, allgemein aber wohl eher nicht.

Gruß,
Christian

PS Danke BJ für die Klarstellung.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Ups :lol:

Mir ging es nicht darum, herauszustellen ob flush in den Beispielen verwendet werden soll oder nicht. Mir ging es einzig darum, dass ich nicht glaube, dass ``print`` automatisch ein flush nachschiebt und sys.stdout.write nicht.

print ist für mich bis jetzt nie etwas anderes gewesen als ein Synonym für

Code: Alles auswählen

def print(*args):
    sys.stdout.write("%s\n" % (" ".join(args)))
Ohne an die Spezialfälle, wie z.B. die Umleitung in eine Datei, zu denken.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Oh, das sind nicht die einzigen Unterschiede. Man denke an die trailing-comma-Regel und an softspace. Außerdem gibt es für C-Objekte einen eigenen tp_print-Slot. Theoretisch kann also "print x" und "write(str(x))" etwas völlig anderes ausgeben.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten