python os.path.getmtime () Zeit ändert sich nicht

9

Ich habe ein kurzes Problem mit Pythons os.path.getmtime() -Funktion. Ich habe ein seltsames Verhalten beobachtet. Ich arbeite an einer Web-App, die regelmäßig überprüft, ob eine bestimmte Datei geändert wurde und entscheidet, ob sie auf dieser Basis aktualisiert wird oder nicht.

In meiner lokalen Python-Befehlszeile, wenn ich die Datei ändere und os.path.getmtime(file_name) aufruft, hat sich der Rückgabewert von mtime geändert, um die Änderung in der Datei widerzuspiegeln.

Wenn ich jedoch os.path.getmtime() in meiner Web-App anrufe, ist der Rückgabewert vor und nach der Änderung derselbe. Ich habe online recherchiert und einige Dinge gefunden, die darauf hindeuten, dass das OS-Modul für die Änderung der zu registrierenden Datei neu geladen werden muss. In meiner Web-App habe ich das Modul os neu geladen, aber mtime spiegelt immer noch keine Änderungen an der Datei wider. Ist jemand anderes schon einmal auf dieses Problem gestoßen oder hat er eine Lösung? Ich habe unten ein Code-Snippet von der Webapp eingefügt:

%Vor%     
Mars J 27.09.2013, 20:52
quelle

3 Antworten

1

Ich habe nicht genug Reputation, um das als Kommentar hinzuzufügen ...

Es ist nicht klar, wie Sie testen, macht eine einzelne Seite Ihrer Web-App

  • drucke mtime
  • Aktualisieren Sie die Datei
  • drucke mtime

Oder

  • drucken Sie einfach mtime

Wenn Ihr Web-App-Testprozess

ist
  • Anfrage Test mtime Seite
  • Aktualisieren Sie die Datei manuell
  • Anfrage Test mtime Seite
  • Beachten Sie, dass mtime in beiden Seitenaufrufen identisch ist

meine erste Vermutung ist Webclient, Proxy oder Server-Caching.

    
Sean 03.10.2013 12:33
quelle
1

Ich bin heute auf dieses Problem gestoßen und habe diese Frage gefunden, also dachte ich, ich würde es hier dokumentieren. Mein Fall war ein Komponententest, also könnte es etwas anders sein, da es kleinere Zeitmaßstäbe betrifft als ein manueller Test.

Die Änderungszeit ist durch Ihr Dateisystem begrenzt. Wenn Sie die Modifikationszeit überprüfen, schreiben Sie eine kleine Datenmenge und überprüfen Sie die Änderungszeit erneut. Die beiden Zeitstempel sind möglicherweise genau gleich. Sie sind gleich, wenn die Zeit zwischen der ersten Zeitstempelprüfung und dem Ende des Schreibvorgangs geringer als die Zeitauflösung ist.

Einige Statistiken zur Zeitauflösung verschiedener gebräuchlicher Dateisysteme:

  • FAT32: 2s
  • ext3: 1s
  • exFAT: 10ms
  • NTFS: 100 ns
  • ext4: 1ns

Sie können erwarten, dass eingebettete Systeme FAT verwenden und eine Zeitauflösung von 2 Sekunden haben. Ältere Windows-Systeme liegen im Bereich von 2 Sekunden. Neuere Windows-Systeme haben 100ns oder 10ms. Ältere UNIX-Systeme haben oft 1s. Neuere UNIX-Systeme haben eine Auflösung von 1ns.

Wenn <time for time stamp check> + <time for file write> kleiner als die Zeitauflösung ist, könnte die Datei so aussehen, als ob sie nicht geändert wurde.

Ich sehe diese möglichen Lösungen:

  • Fügen Sie eine genauere Änderungszeit in die Kopfzeile der Datei ein, die Sie schreiben. Der Dateischreiber könnte sogar prüfen, ob die Datei bereits vor dem Schreiben existiert, und die Änderungszeit im Nanosekundenbereich um mindestens 1 erhöhen, um zu gewährleisten, dass sie aktualisiert wird (auf Kosten der Zeitstempelgenauigkeit).
  • Speichern Sie woanders, wie oft jede Datei bearbeitet wurde. Verwenden Sie diese Nummer, um zu sehen, ob sie seit der letzten Überprüfung bearbeitet wurde. Beachten Sie, dass es wahrscheinlich nicht möglich ist, die Datei atomar zu schreiben und die Änderungsanzahl zusammen zu aktualisieren.
  • Vielleicht können einige Tricks mit sleeps entwickelt werden, so dass die Zeit zwischen der ersten Zeitstempelprüfung und dem Schreiben der Datei immer mindestens die minimale Zeitauflösung ist. Dies hängt stark von Ihrer Art der Einrichtung ab und blockiert den Thread.
Ghostkeeper 29.08.2016 02:02
quelle
0

Vielleicht könnten Sie versuchen, allgemeine Statistiken über die Datei zu erhalten, wie z. B. die Größe.

Ist die erwartete Größe / mtime der Datei vor und nach der Änderung auf dem Server (d. h. beim Anzeigen von ls -l in einem Terminalfenster) gleich oder verschieden.

Wenn die Statistiken bei der Verwendung solcher Kommandozeilen-Tools identisch sind, kann es sein, dass die Datei nicht dort bearbeitet wird, wo Sie denken.

Wenn die Größe / mtime unterschiedlich ist, verwenden Sie vielleicht

%Vor%

Und sehen Sie, ob es einen der richtigen Werte gibt.

    
Paul 01.10.2013 16:28
quelle

Tags und Links