猿问

转储泡菜时文件更新两次

我有一个 python 脚本,当它看到各种文件已更新时,它将运行各种其他脚本。它通过查看文件修改日期快速轮询文件以检查更新。

在大多数情况下,这已按预期工作。当我的一个脚本更新文件时,会触发另一个脚本并采取适当的操作。作为参考,我使用泡菜作为文件类型。

但是,刚刚将新文件和相应的脚本添加到组合中,我注意到文件的修改日期更新了两次的问题。当我执行 pickle.dump() 和退出“with”语句时(文件关闭时)一次。这意味着相应的操作会触发两次而不是一次。我想这是有道理的,但令人困惑的是,我的任何其他文件都不会发生这种行为。

我知道一个简单的解决方法是稍微降低轮询文件的频率,因为文件更新之间的差距非常小。但我想了解为什么这个问题有时会发生,但有时不会。


汪汪一只猫
浏览 172回答 2
2回答

莫回无

我认为您观察到的是 2 个操作:创建文件和更新文件。要解决此问题,请在受监视文件夹之外创建并填充文件,一旦“with”块结束(文件已关闭),请将其从临时位置移动到适当的位置。为此,请查看标准库中的tempfile模块

达令说

如果泡菜足够大(通常在 4+ KB 左右,但它会因操作系统/文件系统而异),这将是预期的行为。大多数pickle将在dump调用期间随着缓冲区填充和写入而写入,但是任何不消耗完整文件缓冲区的部分都将保留在缓冲区中,直到文件关闭(在关闭之前隐式刷新任何未完成的缓冲数据)把手)。我同意另一个答案,即通常的解决方案是将文件写入不同的文件夹(但在同一文件系统上),然后在关闭它后立即os.replace执行原子重命名,将其从临时位置移动到最终位置位置,因此文件打开、文件填充和文件关闭之间没有间隙;该文件要么完整存在,要么根本不存在。
随时随地看视频慕课网APP

相关分类

Python
我要回答