2013-09-27 12 views
9

Mam szybki problem z funkcją Pythona os.path.getmtime(). Zaobserwowałem dziwne zachowanie. Pracuję nad aplikacją internetową, która sprawdza okresowo, czy dany plik został zmodyfikowany i decyduje, czy odświeżyć w oparciu o to.python os.path.getmtime() czas się nie zmienia

W lokalnym wierszu poleceń python, po zmianie pliku i wywołaniu os.path.getmtime(file_name) zmieniono wartość zwracaną z mtime, aby odzwierciedlić zmianę w pliku.

Jednak, gdy zadzwonię pod numer os.path.getmtime() w mojej aplikacji internetowej, wartość zwracana przed zmianą i po niej jest taka sama. Zrobiłem kilka badań online i znalazłem kilka rzeczy sugerujących, że moduł os musi zostać ponownie załadowany w celu zmiany pliku, który ma zostać zarejestrowany. Tak więc w mojej aplikacji internetowej przeładowałem moduł os, ale mtime nadal nie odzwierciedla zmian w pliku. Czy ktoś wcześniej napotkał ten problem lub zna rozwiązanie? Mam włączone poniżej fragment kodu z webapp:

import os 

def function_name(): 
    reload(os) 
    file_path = '/dir/lib/some_file.js' 

    try: 
     mtime = os.path.getmtime(file_path) 
    except os.error: 
     pass 

    return mtime 
+1

Nie, przeładowanie modułu 'os' nie ma ** nic do zrobienia z tym. –

+0

Aa, okay. Tak, czytam w jednym z dokumentów Pythona, że ​​'os.environ' jest ustawiony tylko wtedy, gdy załadowany jest moduł os i myślałem, że może to mieć coś wspólnego z tym. –

+1

'os.path.getmtime()' nie buforuje niczego. Po prostu zwraca 'os.stat (filename) .st_mtime'. 'os.stat()' nie buforuje niczego, po prostu wywołuje bibliotekę C, która prosi system operacyjny o te informacje. –

Odpowiedz

0

Może spróbujesz uzyskanie ogólnych statystyk w pliku oprócz mtime takie jak rozmiar.

Czy oczekiwany rozmiar/mtime pliku przed i po zmianie na serwerze (np. Podczas przeglądania ls -l w oknie terminala) jest taki sam lub inny.

Jeśli statystyki przy użyciu takich narzędzi wiersza poleceń są takie same, być może plik nie jest edytowany tam, gdzie myślisz.

Jeśli rozmiar/mtime jest inny może używać

os.stat(filename) 

i zobaczyć, czy to daje żadnej z prawidłowymi wartościami.

1

nie mam wystarczająco dużo, aby dodać tę reputację jako komentarz ...

Nie jest jasne, w jaki sposób testuje, czy jednej stronie swojej aplikacji internetowej

  • druku mtime
  • aktualizacja plik
  • druku mtime

Albo

  • prostu wydrukować mtime

Jeśli proces testowy web-app jest

  • żądanie Test mtime strona
  • ręcznie zaktualizować plik
  • żądanie strony testowej mtime
  • uwaga to mtime jest takie samo na obu odsłonach

Moje pierwsze przypuszczenie to klient sieci Web, proxy lub buforowanie serwera.

1

Spotkałem się z tym dzisiaj i znalazłem to pytanie, więc pomyślałem, że udokumentuję to tutaj.Mój przypadek był testem jednostkowym, więc może być nieco inny, ponieważ dotyczy on mniejszych skal czasowych niż test ręczny.

Czas modyfikacji jest ograniczony przez system plików. Jeśli sprawdzasz czas modyfikacji, napisz niewielką ilość danych, a następnie sprawdź czas modyfikacji ponownie, dwa znaczniki czasu mogą być dokładnie równe. Będą one równe, jeśli czas pomiędzy pierwszym sprawdzeniem znacznika czasu a końcem zapisu jest mniejszy niż rozdzielczość czasowa.

Niektóre statystyki dotyczące rozdzielczości czasowej różnych systemach common file:

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

Możesz oczekiwać, że systemy wbudowane będą używały FAT i mają ti rozdzielczość 2 sekund. Starsze systemy Windows będą w zasięgu 2 sekund. Nowsze systemy Windows będą miały 100ns lub 10ms. Starsze systemy UNIX często mają 1s. Nowsze systemy UNIX będą miały rozdzielczość 1ns.

Jeśli wartość <time for time stamp check> + <time for file write> jest mniejsza niż rozdzielczość czasu, plik może wyglądać, jakby nie był modyfikowany.

widzę tych możliwych rozwiązań:

  • obejmować bardziej dokładny czas modyfikacji w nagłówku pliku piszesz. Program piszący może nawet sprawdzić, czy plik już istnieje przed zapisaniem i zwiększyć czas modyfikacji nanosekundy o co najmniej 1, aby zagwarantować, że zostanie zaktualizowany (kosztem dokładności znacznika czasu).
  • Przechowywać w innym miejscu, jak często każdy plik był edytowany. Użyj tego numeru, aby sprawdzić, czy był edytowany od ostatniego sprawdzenia. Zauważ, że prawdopodobnie nie można atomowo napisać pliku i zaktualizować razem liczbę modyfikacji.
  • Być może niektóre sztuczki mogą być wymyślone ze snem, tak, że czas pomiędzy pierwszym sprawdzeniem znacznika czasu a zapisem pliku jest zawsze co najmniej minimalną rozdzielczością czasu. To w dużym stopniu zależy od rodzaju konfiguracji i zablokuje wątek.