原子文件写入。
项目描述
原子文件写入。
由于原始包未维护,因此进行分支。
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,否则使用 link 和 unlink 的组合。在Windows上,它通过stdlib的 ctypes 使用适当的标志调用 MoveFileEx。
注意,在使用 link 和 unlink 时,文件可能会在文件系统中以两个条目出现:临时文件名和目标文件名。
此外,目标文件的权限可能会因此而改变。在某些情况下,可以发出 chmod 而不会出现并发问题,但由于这并不总是如此,因此此库不会自动执行此操作。
fsync
在POSIX系统上,在文件写入后(以刷新文件内容和元数据)对临时文件调用 fsync,并在文件移动后(以刷新文件名)对父目录调用 fsync。
fsync 并不关心磁盘的内部缓冲区,但似乎没有标准的POSIX API来处理这一点。在OS X上,出于这个原因,使用 fcntl 与 F_FULLFSYNC 替代 fsync。
在Windows上,使用 _commit,但没有关于磁盘内部缓冲区的保证。
替代方案和致谢
Atomicwrites 直接受到了以下库的启发(并且共享了一小部分代码)
Trac 项目的 实用函数,也用于 Werkzeug 和 mitsuhiko/python-atomicfile。使用 ctypes 而不是 PyWin32 的想法起源于那里。
abarnert/fatomic。Windows支持(基于 PyWin32)最初来源于那里。
atomicwrites 的其他替代方案包括
sashka/atomicfile。最初我考虑使用该库,但在当时它缺少许多我需要的特性(Windows支持、覆盖参数、通过子类覆盖行为)。
Boltons 库集合 具有原子文件写入类,该类似乎具有非常相似的 overwrite 参数。但它缺少Windows支持。
许可协议
根据MIT许可,请参阅 LICENSE。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定要选择哪个,请了解更多关于 安装软件包 的信息。
源代码分发
构建分发
哈希值 for atomicwrites_homeassistant-1.4.1-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 01457de800961db7d5b575f3c92e7fb56e435d88512c366afb0873f4f092bb0d |
|
MD5 | 8775e4a5e54408989dc49b2d6ac13b2c |
|
BLAKE2b-256 | 4e1b872dd3b11939edb4c0a27d2569a9b7e77d3b88995a45a331f376e13528c0 |