PythonWin: verzögerte Ausgabe

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
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Hallo liebe Gemeinde! ;-)

Ich arbeite hier (leider) auf Windows XP und benutze die IDE von PythonWin. Auf meiner Festplatte befinden sich eine Reihe an Dateien, die ich gerne archivieren möchte, die aber alle identisch benannt sind. Denk ich also: kein Problem, schreibst ein kleines Script, das die Dateien alle raussucht und eine laufende Nummer in den Dateinamen einfügt. Sieht dann so aus (noch ohne umbenennen, nur Anzeige):

Code: Alles auswählen

import os

def renAll(filename, startdir = '.'):
    print
    print "suche " + filename
    w = os.walk(startdir)
    counter = 0
    while True:
        try:
            x = w.next()
            if filename in x[2]:
                counter += 1
                renameArgument1 = os.path.join(x[0], filename)
                renameArgument2 = os.path.join(x[0], '%d_%s' % (counter, filename))
                print renameArgument1
                print renameArgument2
        except: 		
            print 'found %d files. found no more.' % (counter,)
            return 

if __name__ == '__main__':
    renAll('Dateiname.xyz', 'C:\\')
Nun ist mir aber aufgefallen, dass die Ausgabe von Zeile 16 erst kommt, wenn die nächste print-Anweisung kommt, sprich: das Script entweder wieder in Zeile 15 landet oder bei Zeile 18 ankommt. Hat PythonWin irgendeinen Output-Buffer von dem ich wissen sollte? Irgendwer Ahnung? Ist sicherlich kein schwerwiegendes Problem, aber ich fühl mich dabei irgendwie unwohl. :?

TIA
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Hat PythonWin irgendeinen Output-Buffer von dem ich wissen sollte?
Ersteres: ja. Zweiteres: weiß ich nicht, dass mußt Du mit Dir selbst ausmachen. ;-)

Kannst mal probieren ob

Code: Alles auswählen

sys.stdout.flush()
hinter dem zweiten print was bringt.
--- Heiko.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mein Tipp: Schmeiß die IDE weg und nimm SciTE ;)

Zum testen, kannst du das Skript aber auch mal nackig auf der Konsole laufen lassen!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

@modelnine: Danke schön! Woher weißt Du, dass es diesen Puffer gibt?
jens hat geschrieben:Mein Tipp: Schmeiß die IDE weg und nimm SciTE ;)
Ich wüsste jetzt nicht warum ich das tun sollte. Die IDE basiert ebenso auf Scintilla und die zusätzlichen Funktionen sind richtig gut. Vor allem für Windows-Programmierung.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Bei interaktiven Systemen (sprich eine IDE, die eine Konsole emuliert) ist das fast immer so, dass sie gepuffert sind, denn das unterliegende pty-artige Ding ist auch im Normalfall gepuffert (unter Windows, und auch unter Unix), teilweise Zeilenweise, teilweise Blockweise, kommt immer auf das System an. Das ganze ist an, außer das Programm was ausgeführt ist oder aber das Terminal selbst (also das Programm was das ganze anzeigt) stellen das explizit aus.

Es hätte mich also gewundert wenn PythonWin anders gewesen wäre...

Unabhängig davon: wenn sowas passiert, mach einfach ein sys.stdout.flush(), und guck was passiert. Wenn's dann geht hast Du ein Pufferungsproblem. Wenn's danach nicht geht, ists auch egal, der Befehl kann nichts kaputt machen.
--- Heiko.
Antworten