python的shutil.copyfile()是原子的吗?

时间:2014-01-01 21:57:59

标签: python linux shutil

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

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

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

2 个答案:

答案 0 :(得分:5)

不,似乎只是loop, reading and writing 16KB at a time

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

答案 1 :(得分:3)

不,shutil.copyfile不是原子的。这是definition of shutil.copyfile:

的一部分
def copyfile(src, dst, *, follow_symlinks=True):    
    ...
    with open(src, 'rb') as fsrc:
        with open(dst, 'wb') as fdst:
            copyfileobj(fsrc, fdst)

其中copyfileobj is defined like this

def copyfileobj(fsrc, fdst, length=16*1024):
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)

调用copyfile的线程可以在此while-loop内停止,此时某些其他进程可能会尝试打开要读取的文件。它会得到一个损坏的文件视图。