Print gibt zeichen erst beim nächsten print aus?

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
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

Hallo,

ich hab gerade ein kleines Problem bei meinem Programm festgestellt. Ich printe immer vor jeder Teilaufgabe einen kurzen Text auf den Display, das gleiche mach ich wenn die Teilaufgabe zu ende ist.

Bsp.:

Code: Alles auswählen

print "Aufgabe 1 beginnt...",
Aufgabe1()
print "Aufgabe 1 beendet"
Ausgabe:
Aufgabe 1 beginnt... Aufgabe 1 beendet

Leider schreibt er "Aufgabe 1 beginnt..." erst wenn er zum print von "Aufgabe 1 beendet" kommt.

Woran liegt das, und wie kann ich das verhindern?

Vielen Dank,
Draufunddran
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

draufunddran hat geschrieben: Leider schreibt er "Aufgabe 1 beginnt..." erst wenn er zum print von "Aufgabe 1 beendet" kommt.
Wie kannst Du das feststellen?

Ohne wirklichen Code (z.B. was in Aufgabe() passiert und worin diese print-Statements enthalten sind) kann man schwerlich etwas dazu sagen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@draufunddran: Wo landen denn die Ausgaben? Auf einer Textkonsole oder in einem Fenster in irgendeiner IDE?
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

Ich seh es am Bildschirm, dass die Funktion Aufgabe1() ziemlich Lange braucht bis sie dann endlich zum zweiten print kommt...

Der code ist ja völlig egal, das ist nur numbercrunshing.

Achja die Ausgaben landen in der Konsole.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

draufunddran hat geschrieben:Ich seh es am Bildschirm, dass die Funktion Aufgabe1() ziemlich Lange braucht bis sie dann endlich zum zweiten print kommt...
Naja, das ist doch das erwartete würde ich sagen...

Versuche das mal anchzuvollziehen; ich denke das erklärt es ;-)

Code: Alles auswählen

In [18]: from time import sleep

In [23]: def foo():
   ....:     print "Hallo",
   ....:     sleep(3)
   ....:     print " Welt"
   ....:     
   ....:     

In [24]: foo()
Hallo  Welt

In [25]: def bar():
   ....:     print "Hallo"
   ....:     sleep(3)
   ....:     print " Welt"
   ....:     
   ....:     

In [26]: bar()
Hallo
 Welt
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

Also ich hab das jetzt im IDLE laufen lassen und sehen keinen unterschied.

Er printed beides mal "Hallo" und nach 3 sekunden " Welt"

mein problem ist ja das er den ersten Text erst anzeigt wenn er zum zweiten print komm. Aber ich will ja eben wissen wann und ob er überhaupt mit der aufgabe angefangen hat, und mit welcher aufgabe...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

draufunddran hat geschrieben:Also ich hab das jetzt im IDLE laufen lassen und sehen keinen unterschied.
Hm... muss dann ein IDLE spezifisches Problem sein!
draufunddran hat geschrieben: Er printed beides mal "Hallo" und nach 3 sekunden " Welt"
In ipython eben nicht; die Variante mit "," am Ende wird erst dann geprintet, wenn die Funktion abgearbeitet wurde. Darauf wollte ich ja hinaus. Wieso das in IDLE anders geht ist mit dann ein Rätsel. Zudem ist es sonderbar, dass IDLE das bei Deinem Script anders handhabt!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

also mein code mit copy paste:

Code: Alles auswählen

import time

def foo():
    print "Hallo",
    time.sleep(3)
    print " Welt"

def bar():
    print "Hallo"
    time.sleep(3)
    print " Welt"
ich versuchst jetzt nochmal in der konsole...

wie bekommt man das den weg, das er es eben gleich anzeigt?
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

Ja in der Konsole zeigt sich der Effekt jetzt auch...

Kennt da einer ne Lösung?
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Folgendes hilft:

Code: Alles auswählen

import sys
sys.stdout.flush()
Grüße
Gerrit
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

draufunddran hat geschrieben:also mein code mit copy paste:

Code: Alles auswählen

import time

def foo():
    print "Hallo", # <-- das "," ist der entscheidene Unterschied!
    time.sleep(3)
    print " Welt"

def bar():
    print "Hallo" # <-- hier kein Komma
    time.sleep(3)
    print " Welt"

# ergänzt
foo()
bar()
Kann ja schon nicht komplett sein; es fehlen die Aufrufe ;-)

Bist Du sicher, dass Du das in IDLE hast ablaufen lassen? Wirklich exakt so? Ich kann mir da nicht vorstellen, inwiefern IDLE bei foo() schon ein "Hallo" printen kann...
Außerdem frage ich mich immer noch, wieso Dein Ursprungsscript in IDLE eben genauso reagiert, wie ich es in der Shell simuliert habe.

Wegbekommen ist ganz einfach; eben nicht per "," nach dem print in der selben Zeile "ausharren". Genau darin besteht ja der Unterschied zwischen den Varianten.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

gkuhl hat geschrieben:Folgendes hilft:

Code: Alles auswählen

import sys
sys.stdout.flush()
Grüße
Gerrit
Stimmt. Hier meine neue Version:

Code: Alles auswählen

In [46]: def foo(flush=True):
   ....:     print "Hallo",
   ....:     if flush:
   ....:         sys.stdout.flush()
   ....:     sleep(3)
   ....:     print " Welt"
   ....:     
   ....:     
Der Aufruf foo() bewirkt nun, dass "Hallo" sofort geprintet wird, foo(False) das erst nach Abarbeiten von sleep alles zusammen ausgegeben wird.

Dennoch passt das ja immer noch nicht zur Beobachtung des OP ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

die Funktionsaufrufe hab ich dann schon in IDLE reingetippt, der code war nur die Funktionen das ist klar...

ich werd das mal mit dem flush() versuchen... DANKE schonmal ich denke ihr werden damit schon recht haben!

Grüße und Vielen Dank
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

Funktioniert einwandfrei...

Danke
Antworten