Обнаружение и удаление заблокированного файла в Python - PullRequest
4 голосов
/ 24 августа 2009

Я хочу определить, заблокирован ли файл, используя python в Unix. Это нормально, чтобы удалить файл, при условии, что он помогает определить, был ли файл заблокирован.

Файл мог быть первоначально открыт исключительно другим процессом. Документация предполагает, что os.unlink не обязательно вернет ошибку, если файл заблокирован.

Идеи?

Ответы [ 3 ]

8 голосов
/ 24 августа 2009

Лучший способ проверить, заблокирован ли файл, - это попытаться заблокировать его. Модуль fcntl сделает это на Python, например,

fcntl.lockf(fileobj.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)

Это вызовет IOError, если файл уже заблокирован; если это не так, вы можете позвонить

fcntl.lockf(fileobj.fileno(), fcntl.LOCK_UN)

Чтобы разблокировать его снова.

Обратите внимание, что в отличие от Windows, открытие файла для записи автоматически не дает вам эксклюзивной блокировки в Unix. Также обратите внимание, что модуль fcntl недоступен в Windows; вам нужно будет использовать os.open , который является гораздо менее дружественным, но более переносимым интерфейсом (и может потребовать повторного открытия файла).

7 голосов
/ 24 августа 2009

Из fcntl документов:

fcntl.lockf (fd, операция [, длина [, начало [, откуда]]])

Если используется LOCK_NB и блокировка не может быть получена, будет сгенерировано IOError, а для исключения будет присвоено значение атрибута errno, равное EACCES или EAGAIN (в зависимости от операционной системы; для переносимости, проверьте оба значения). *

При этом используется базовый механизм Unix flock, поэтому похоже, что он должен делать то, что вы хотите. Также обратите внимание, что есть также os.open, который может быть более независимым от платформы.

0 голосов
/ 10 февраля 2019

Я пытался заблокировать файл в Mac и удалить тот же файл в другом терминале. Позволяет удалить файл.

lock_file_path = "/tmp/lock.file"
fd = open(lock_file_path,"w")
fcntl.flock(fd.fileno(),LOCK_EX)
while True:
    print("Locked")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...