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