是python';s shutil.copyfile()原子文件?

是python';s shutil.copyfile()原子文件?,python,linux,shutil,Python,Linux,Shutil,我正在编写一个python脚本,它在Linux上使用复制文件。在复制过程中,其他进程可能正在尝试读取该文件。以下内容是否足以确保外部进程不会获取文件的损坏视图 os.unlink(dest) shutil.copyfile(src, dest) 也就是说,shutil.copyfile()是否是原子的,以便在复制操作完成之前,其他进程无法读取目标文件?否,shutil.copyfile不是原子的。这是问题的一部分 其中: 调用copyfile的线程可以在此循环中停止,此时其他进程可以尝试打开要

我正在编写一个python脚本,它在Linux上使用复制文件。在复制过程中,其他进程可能正在尝试读取该文件。以下内容是否足以确保外部进程不会获取文件的损坏视图

os.unlink(dest)
shutil.copyfile(src, dest)

也就是说,shutil.copyfile()是否是原子的,以便在复制操作完成之前,其他进程无法读取目标文件?

否,
shutil.copyfile
不是原子的。这是问题的一部分

其中:

调用
copyfile
的线程可以在此
循环中停止,此时其他进程可以尝试打开要读取的文件。它会得到一个损坏的文件视图。

不,似乎只是


对于原子复制操作,您应该将文件复制到同一文件系统上的不同位置,然后
os.rename()
将其复制到所需位置(在Linux上保证是原子的)。

最好复制到同一目录中的临时文件,然后再复制到os.rename()*ix:这样它是原子的,即使在NFS上也是如此。如果一个或多个进程已经打开了文件,它们将继续看到旧版本,而文件的后续open()将看到新内容。
def copyfile(src, dst, *, follow_symlinks=True):    
    ...
    with open(src, 'rb') as fsrc:
        with open(dst, 'wb') as fdst:
            copyfileobj(fsrc, fdst)
def copyfileobj(fsrc, fdst, length=16*1024):
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)