2016-02-29 5 views
2

Я загрузил модуль filelock, чтобы заблокировать файлы с помощью моей программы python. это мой код:python filelock модуль, удаляющий файлы

import filelock 
lock = filelock.FileLock(path) 
lock.acquire() 
#do something... 
lock.release() 

по какой-то причине я не понимаю, когда я выпускаю замок файл удален. Кто-нибудь знает, как с этим бороться? Как я могу сохранить файл также после освобождения блокировки? Если это актуально, мой файл хранится на отдельном жестком диске. спасибо.

Я использую Windows 10 про

+0

В какой операционной системе вы это делаете? – siphr

+0

@ PawełKordowski контекстный менеджер? – IsaacDj

+0

см. Http://stackoverflow.com/a/498505/2999347 –

ответ

3

Я не знаю, почему, но документация предполагает, что он не должен делать то, что вы испытываете. Однако, если вы используете это в Windows, вы можете посмотреть на реализацию блокировки релиза, и вы поймете, что он действительно удалит файл, если он является последней блокировкой или если блокировка принудительно выпущена. Пожалуйста, ознакомьтесь с разделом «Windows locking mechanism».

Основная реализация для окон блокировки использует следующий код разблокировки:

def _release(self): 
    msvcrt.locking(self._lock_file_fd, msvcrt.LK_UNLCK, 1) 
    os.close(self._lock_file_fd) 
    self._lock_file_fd = None 

    try: 
     os.remove(self._lock_file) 
    # Probably another instance of the application 
    # that acquired the file lock. 
    except OSError: 
     pass 
    return None 

Как вы можете видеть, что os.remove удалит файл. Хотя это не помогает, но, надеюсь, объясняет, почему это происходит. Может быть ошибка или устаревший код, который кто-то забыл удалить.

+0

Знаете ли вы, как я могу это переопределить? Я не могу хранить файлы в temp, потому что они большие .. – IsaacDj

+0

Теперь, почему это произойдет? Это кажется таким странным ... Я тестировал на своем Mac, и все работает нормально. Файл все еще есть. – idjaw

+0

@idjaw Код влияет только на окна. – siphr

0

Это работает для меня в Windows, а также должен работать для вас benediktschmitt

Привет,

случая использования для этой библиотеки signalizing различных экземпляров приложения, что общие ресурсы в настоящее время доступны , Например, для примера . Некоторые программы синхронизации создают файл блокировки во время синхронизации в корневой папке, чтобы другие экземпляры с выполняли его в одно и то же время. Как только файл блокировки был удален, другой экземпляр запускает синхронизацию.

Если вы хотите, чтобы избежать состояния гонки, вы можете использовать либо эту библиотеку так:

lock = FileLock(flnm + ".lock") with lock.acquire(timeout=5):
with open(flnm, "a") as file: file.write("some text")

или вы посмотрите на нижележащих функций ОС: https://www.safaribooksonline.com/library/view/python-cookbook/0596001673/ch04s25.html

EDIT: Удаление файла выполняется намеренно как часть очистки.

Смежные вопросы