Moja aplikacja, mam następujące żądania: 1. Nie ma jednego wątku będzie regularnie nagrywać niektóre dzienniki w pliku. Plik dziennika będzie rolować w określonych odstępach czasu. do przechowywania małych plików dziennika. 2. Nie ma innego wątku również będzie regularnie przetwarzać te pliki dziennika. Przykład: Przenieś pliki dziennika do innego miejsca, przeanalizuj zawartość dziennika, aby wygenerować niektóre raporty dziennika.Sprawdź, czy plik nie jest otwarty (nieużywany w innym procesie) w Pythonie
Ale istnieje warunek, że drugi wątek nie może przetworzyć pliku dziennika, który jest używany do rejestrowania dziennika. w stronie kodowej, że podobieństw pseudokod jak poniżej:
#code in second thread to process the log files
for logFile in os.listdir(logFolder):
if not file_is_open(logFile) or file_is_use(logFile):
ProcessLogFile(logFile) # move log file to other place, and generate log report....
Tak, jak mogę sprawdzić to plik jest już otwarty i jest używany przez inny proces? Zrobiłem trochę badań w Internecie. I pewne wyniki:
try:
myfile = open(filename, "r+") # or "a+", whatever you need
except IOError:
print "Could not open file! Please close Excel!"
próbowałem tego kodu, ale to nie działa, nie ważne używam "r +" lub "+" flag
try:
os.remove(filename) # try to remove it directly
except OSError as e:
if e.errno == errno.ENOENT: # file doesn't exist
break
Kod ten może pracować, ale to nie mogę osiągnąć mojego żądania, ponieważ nie chcę usuwać pliku, aby sprawdzić, czy jest otwarty.
Czy próbowałeś zmienić 'os.remove' na' ProcessLogFile' wewnątrz ostatniego bloku 'try'? Może poprawić numer błędu: są "EBUSY" i [inne] (http://docs.python.org/library/errno.html), aby spróbować. –
Możesz chcieć przeczytać to pytanie: http://stackoverflow.com/questions/2023608/check-what-files-are-open-in-python, a szczególnie ta http://stackoverflow.com/a/7142094/546873 odpowiedź – Nicoretti
Jak zrobić podobne rzeczy na platformie Windows, aby wyświetlić listę otwartych plików. – zengwke