Невозможно заблокировать файл в Python - PullRequest
0 голосов
/ 05 октября 2018

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

IМы провели некоторый поиск и увидели, что в системах на основе Unix общепринятый способ сделать это - попытаться заблокировать файл.Если вы получили блокировку, тогда отлично, продолжайте и запустите, если вы не можете ее получить, вы знаете, что другой процесс уже запущен.Я написал следующий код:

import fcntl
import traceback

class ProcessLock:

    def __init__(self, path_to_file, block):
        self.file_path = path_to_file
        try:
            options = fcntl.LOCK_EX
            if not block:
                options = options | fcntl.LOCK_NB

            self.file = open(path_to_file, 'w+')
            self.lock = fcntl.flock(file, options)
        except:
            print 'caught something: {}'.format(traceback.format_exc())
            self.file = None
            self.lock = None

    def is_locked(self):
        return self.lock is not None

    def unlock(self):
        self.lock = None
        self.file = None

def aquire_lock(lock_name):
    path = '/tmp/{}.lock'.format(lock_name)
    return ProcessLock(path, False)

def aquire_lock_blocking(lock_name):
    path = '/tmp/{}.lock'.format(lock_name)
    return ProcessLock(path, True)

Однако я не могу заставить его работать.Я искал, и все примеры, которые я видел, и другие вопросы, размещенные здесь, похоже, работают с использованием кода, который я получил.Я также пробовал и flock и lockf, но ни одна из них не работает.Вызов open работает правильно, но я выхожу из консоли:

self.lock = fcntl.flock(file, options)
TypeError: descriptor 'fileno' of 'file' object needs an argument 

Я недостаточно знаю Python, чтобы понять, что означает эта ошибка.Надеюсь, кто-нибудь увидит, что я делаю что-то не так.Я запускаю это в Pycharm на MacOS

...