Ich glaube, dass Sie in der Kernel-NFS-Implementierung in einen Cache laufen. Im Folgenden finden Sie einen Link zu einer Seite, auf der das Problem beschrieben wird, sowie einige Methoden zum Leeren des Caches.
Datei-Handle Caching
Verzeichnisse Cache-Dateinamen zu Dateizugriffszuordnung. Die häufigsten Probleme dabei sind:
• Sie haben eine geöffnete Datei, und Sie müssen überprüfen, ob die Datei durch eine neuere Datei ersetzt wurde. Sie müssen den Dateihandle-Cache des übergeordneten Verzeichnisses leeren, bevor stat() die Informationen der neuen Datei und nicht die der geöffneten Datei zurückgibt.
◦Dieser Fall hat ein anderes Problem: Die alte Datei wurde möglicherweise gelöscht und durch eine neue Datei ersetzt, aber beide Dateien haben möglicherweise denselben Inode. Sie können diesen Fall überprüfen, indem Sie den Attributcache der geöffneten Datei leeren und dann sehen, ob fstat() mit ESTALE fehlschlägt.
• Sie müssen prüfen, ob eine Datei existiert. Zum Beispiel eine Sperrdatei. Kernel hat möglicherweise zwischengespeichert, dass die Datei nicht existiert, auch wenn es in Wirklichkeit ist. Sie müssen den negativen Dateizugriffsspeicher des übergeordneten Verzeichnisses leeren, um zu sehen, ob die Datei wirklich existiert.
Ein paar Möglichkeiten, um die Datei-Handle-Cache zu leeren:
• Wenn das übergeordnete Verzeichnis des mtime geändert, die Datei-Handle-Cache durch Spülen sein Attribut Cache geleert wird. Dies sollte ziemlich gut funktionieren, wenn der NFS-Server eine Auflösung im Nanosekunden- oder Mikrosekundenbereich unterstützt.
• Linux: chown() das Verzeichnis zu seinem aktuellen Besitzer. Der Dateizugriffsspeicher wird geleert, wenn der Aufruf erfolgreich zurückgegeben wird.
• Solaris 9, 10: Die einzige Möglichkeit besteht darin, das übergeordnete Verzeichnis rmdir() zu versuchen. ENOTEPTY bedeutet, dass der Cache geleert wird. Beim Versuch, rmdir() zu erstellen, schlägt das aktuelle Verzeichnis mit EINVAL fehl und löscht den Cache nicht.
• FreeBSD 6.2: Die einzige Möglichkeit ist, rmdir() entweder das übergeordnete Verzeichnis oder die Datei darunter zu versuchen. Fehler ENOTEPTY, ENOTDIR und EACCES bedeuten, dass der Cache geleert wird, aber ENOENT hat ihn nicht gelöscht. FreeBSD cache negative Einträge nicht, so dass sie nicht geleert werden müssen.
Sie können sehen, ob 'os.access' das gleiche Problem hat:' os.access ("/ foo", os.F_OK) ' – Amber
' os.access() 'erscheint, um die gleiche Antwort wie' os zu geben. path.exists() ' – Noah
Was ist, wenn Sie zuerst [' reload (os) '] (http://docs.python.org/library/functions.html#reload) eingeben? –