我有一个python脚本,它让我在使用Python2.7.3的Ubuntu12.02上遇到了困难。
PS:它在Windows上运行时没有问题。
>>> import os
>>> import shutil
>>> shutil.copy("/mnt/my_network_dive/somewhere/sample.xml", "/mnt/my_network_drive/COMPLETED/")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/shutil.py", line 117, in copy
copyfile(src, dst)
File "/usr/lib/python2.7/shutil.py", line 69, in copyfile
raise Error("`%s` and `%s` are the same file" % (src, dst))
shutil.Error: `/mnt/my_network_dive/somewhere/sample.xml` and `/mnt/my_network_drive/COMPLETED/sample.xml` are the same file检查文件的某些属性:
>>> os.path.exists("/mnt/my_network_drive/somewhere/sample.xml")
True
>>> os.path.exists("/mnt/my_network_drive/COMPLETED/sample.xml")
True
>>> os.stat("/mnt/my_network_drive/somewhere/sample.xml")
posix.stat_result(st_mode=33272, st_ino=4913809333, st_dev=25L, st_nlink=1, st_uid=1000, st_gid=0, st_size=5447, st_atime=1465311674, st_mtime=1465311674, st_ctime=1465311685)
>>> os.stat("/mnt/my_network_drive/COMPLETED/sample.xml")
posix.stat_result(st_mode=33272, st_ino=4913809333, st_dev=25L, st_nlink=1, st_uid=1000, st_gid=0, st_size=10, st_atime=1465317482, st_mtime=1465317482, st_ctime=1465317483)
>>> os.path.islink("/mnt/my_network_drive/somewhere/sample.xml")
False
>>> os.path.islink("/mnt/my_network_drive/COMPLETED/sample.xml")
False
>>> shutil._samefile("/mnt/my_network_dive/somewhere/sample.xml", "/mnt/my_network_drive/COMPLETED/sample.xml")
False正如您所看到的,调用shutil._samefile我得到了False,但是shutil.copy仍然提高了samefile error。
我是不是忘了什么?还有其他方法可以用Python移动或复制文件吗?
发布于 2016-06-07 17:21:10
看起来这两个文件都是指向同一个文件的硬链接。您可以知道,因为它们共享相同的inode编号。
st_ino=4913809333Windows用户通常不会创建硬链接。它们在linux环境中更常见,这就是为什么到目前为止您可能还没有遇到这个问题。
奇怪的是,samefile返回False。您所使用的操作系统是什么?shutil._samefile只是os.path.samefile的包装器(在存在该功能的系统上)。你从os.path.samefile得到什么结果?在posix系统上,它只检查设备和inode是否匹配(在您的情况下是这样),并且应该返回True。
posixpath.py
def samefile(f1, f2):
s1 = os.stat(f1)
s2 = os.stat(f2)
return samestat(s1, s2)
def samestat(s1, s2):
return s1.st_ino == s2.st_ino and s1.st_dev == s2.st_dev发布于 2016-06-07 17:33:50
在python 3 In shutil.copy中,有附加的参数follow_symlinks=True查看这个https://docs.python.org/3/library/shutil.html
如果follow_symlinks是false,而src是一个符号链接,那么dst将被创建为一个符号链接。如果follow_symlinks是真的,而src是一个符号链接,那么dst将是src引用的文件的副本。
https://stackoverflow.com/questions/37685401
复制相似问题