【问题标题】:python filelock module deleting filespython filelock模块删除文件
【发布时间】:2016-02-29 12:22:54
【问题描述】:

我已经下载了filelock 模块,以便使用我的python 程序锁定文件。 这是我的代码:

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

由于某种原因,我不明白何时释放文件已删除的锁定。 有谁知道如何处理这个?锁定释放后如何保持文件可用? 如果相关,我的文件将保存在单独的硬盘上。 谢谢。

我使用的是 Windows 10 专业版

【问题讨论】:

  • 您在哪个操作系统上执行此操作?
  • @PawełKordowski 上下文管理器?
  • 注意:传递给文件锁的“路径”不是您要控制访问的实际文件。这是一个任意路径,象征性地表示某些资源被锁定。在很多情况下,如果资源是文件或目录,则锁定路径具有相同的名称,但扩展名为.lock,但这只是约定。在其他情况下,锁位于 /var/lock/SOMEWHERE 下。请记住,这是“建议锁定”:所有访问您要保护的文件的代码都必须使用相同的锁定文件路径。锁定文件路径甚至可以表示您不希望并行发生的任意事情。

标签: python python-2.7 filelock


【解决方案1】:

我不知道为什么,但文档表明它不应该做你正在经历的事情。但是,如果您在 Windows 上使用它,您可以查看释放锁的实现,您会意识到如果它是最终锁或强制释放锁,它确实会删除文件。请查看“Windows locking mechanism”部分。

windows 锁定的底层实现使用以下发布代码:

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 将删除该文件。尽管这无济于事,但希望能解释为什么会发生这种情况。可能是有人忘记删除的错误或陈旧代码。

【讨论】:

  • 你知道我可以覆盖它的方法吗?我无法将文件保存在临时文件中,因为它们很大..
  • 现在,为什么会发生这种情况?这看起来很奇怪......我在我的 Mac 上进行了测试,一切正常。文件还在。
  • @IsaacDj 我建议最好的方法是与模块开发人员进一步讨论。事实证明,这是一个可能被忽视的缺陷,或者至少您可能会得到一个合理的解释,说明为什么会这样以及如何解决它。
  • @siphr 锁也擦除文件内容的原因是什么?
  • 如果您的意思是在创建或获取锁时它会很好地清空文件的内容,那是因为模块创建了带有截断标志的锁文件。这意味着如果文件已经存在,将始终被截断(清空)。
【解决方案2】:

这适用于我在 Windows 中,也应该适用于你 benediktschmitt

嗨,

这个库的用例是表示不同的实例 应用程序,共享资源当前被访问。为了 示例:某些同步程序在 在根文件夹中同步以防止其他实例 同时做。一旦锁定文件被删除, 另一个实例开始同步进程。

如果你想避免竞争条件,你可以使用这个库 像这样:

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

编辑:作为清理的一部分,有意删除文件。

【讨论】:

    猜你喜欢
    • 2014-04-07
    • 2011-01-30
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多