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

din*_*aur 10 python linux shutil

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

os.unlink(dest)
shutil.copyfile(src, dest)
Run Code Online (Sandbox Code Playgroud)

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

unu*_*tbu 7

不,shutil.copyfile不是原子的。这是定义的一部分shutil.copyfile

def copyfile(src, dst, *, follow_symlinks=True):    
    ...
    with open(src, 'rb') as fsrc:
        with open(dst, 'wb') as fdst:
            copyfileobj(fsrc, fdst)
Run Code Online (Sandbox Code Playgroud)

其中copyfileobj定义如下

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

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


use*_*221 6

不,它似乎只是循环,一次读取和写入16KB.

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