跳转到主要内容

原子文件写入。

项目描述

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

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

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

替代方案和致谢

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

atomicwrites 的其他替代方案包括

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

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

许可协议

根据MIT许可,请参阅 LICENSE

项目详情


下载文件

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

源代码分发

atomicwrites-homeassistant-1.4.1.tar.gz (12.2 kB 查看哈希)

上传时间 源代码

构建分发

atomicwrites_homeassistant-1.4.1-py2.py3-none-any.whl (7.1 kB 查看哈希)

上传于 Python 2 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面