跳转到主要内容

原子文件写入。

项目描述

https://travis-ci.cn/untitaker/python-atomicwrites.svg?branch=master https://ci.appveyor.com/api/projects/status/vadc4le3c27to59x/branch/master?svg=true Documentation Status

原子文件写入。

from atomicwrites import atomic_write

with atomic_write('foo.txt', overwrite=True) as f:
    f.write('Hello world.')
    # "foo.txt" doesn't exist yet.

# Now it does.

有关更多低级接口,请参阅 API文档

使其与其他类似库区别开来的特性(见 替代方案和信用

  • 无竞争断言目标文件尚不存在。这可以通过 overwrite 参数进行控制。

  • Windows支持,但未经充分测试。MSDN资源对哪些操作是原子的描述并不明确。我基于 一个评论,该评论由 Doug Cook 提供,他似乎是一位微软员工

    问题:如果现有文件和新文件都在同一个驱动器上,MoveFileEx是否是原子的?

    简单的答案是“通常情况下是这样的,但在某些情况下它可能会无声地回退到非原子方法,所以不要指望它”。

    MoveFileEx的实现看起来像这样:[…]

    问题是如果重命名失败,你可能会得到一个CopyFile,这绝对不是原子的。

    如果你真的需要原子或无,你可以尝试调用NtSetInformationFile,这是不受支持的,但更有可能原子。

  • 简单的面向对象API,它包装了一个非常灵活的类API。

  • 跨平台一致的错误处理。

工作原理

它使用与给定路径相同的目录中的临时文件。这确保了临时文件位于同一个文件系统上。

临时文件随后将原子性地移动到目标位置:在POSIX系统中,如果需要覆盖文件,则使用 rename,否则使用 linkunlink 的组合。在Windows系统中,它通过stdlib的 ctypes 使用适当的标志调用 MoveFileEx

请注意,在使用 linkunlink 时,文件可能在文件系统中以两个条目存在的时间窗口:临时文件名和目标文件名。

此外,目标文件的权限可能因此而改变。在某些情况下,可以发出 chmod 而不会出现任何并发问题,但由于这并不总是如此,因此这个库不会自行执行此操作。

fsync

在POSIX系统中,fsync 在写入临时文件后(用于刷新文件内容和元数据)以及在文件移动后对父目录调用(用于刷新文件名)。

fsync 并不处理磁盘的内部缓冲区,但似乎没有标准的POSIX API可以做到这一点。在OS X上,由于这个原因,使用 fcntlF_FULLFSYNC 代替 fsync

在Windows上,使用 _commit,但没有关于磁盘内部缓冲区的保证。

替代方案和致谢

Atomicwrites 直接受到以下库的启发(并且共享了最小量的代码)

Atomicwrites 的其他替代方案包括

  • sashka/atomicfile。最初我考虑使用它,但当时它缺少我需要的许多功能(Windows支持、覆盖参数、通过子类化覆盖行为)。

  • Boltons 库集合 中有一个用于原子文件写入的类,它似乎有一个非常相似的 overwrite 参数。但它缺少Windows支持。

许可证

根据MIT许可,请参阅 LICENSE

项目详情


下载文件

为您的平台下载文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源代码发行版

atomicwrites-1.4.1.tar.gz (14.2 kB 查看哈希值)

上传时间 源代码

由以下支持