2016-06-07 243 views
3

我有一個python腳本,它使我在Ubuntu 12.02上使用Python 2.7.3很難。 PS:它在Windows上運行時沒有問題。在Linux上shutil samefile錯誤

>>> 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?

+0

沒有必要複製它們。它們是指向同一文件的兩個不同的目錄條目。作爲相同的文件,他們的內容不可能有所不同。 –

+0

(爲什麼'shutil._samefile'返回False是一個不同的問題,也許是提交錯誤的一些問題,但由於'st_dev'和'st_ino'是相同的,所以毫無疑問它真的是兩者指向的內容相同目錄條目)。 –

+1

@vmenezes在第一個框中複製的第一個參數包含驅動器的潛水故障,是否只有錯字? –

回答

2

看起來這兩個文件都是硬鏈接到同一個文件。你可以告訴,因爲他們共享相同的節點號

st_ino=4913809333 

Windows用戶通常不會創建硬鏈接。它們在Linux環境中更常見,這就是爲什麼你可能直到現在纔會遇到問題的原因。

samefile返回False奇怪。你在使用什麼操作系統? shutil._samefile只是一個圍繞os.path.samefile的包裝(在存在該功能的系統上)。你從os.path.samefile得到什麼結果?在POSIX系統中,它只是檢查該設備和節點匹配(這是他們在你的情況一樣),它應該返回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 
+0

它可能是一個或兩個父目錄是符號鏈接到同一目錄。 – tdelaney

+0

@tdelaney但是'samefile'在這種情況下仍然應該返回'True',對吧? –

+0

是的,我和你一樣困惑。與硬鏈接一樣,dev和inode應該是相同的。 – tdelaney

0

蟒蛇在shutil 3。複製還有額外的參數follow_symlinks =真 看這個https://docs.python.org/3/library/shutil.html

如果follow_symlinks是假的,SRC是一個符號鏈接,DST將CR作爲一個象徵性的鏈接。如果follow_symlinks爲true並且src是符號鏈接,則dst將是src引用的文件的副本。

+0

不回答OP有關Python 2.7.3的問題。 – martineau

+0

@martineau但是也許檢查它在Python 3中的工作原理可能有助於確定是否是問題所在。如果是的話,也許他可以查看更新版本的來源並複製此代碼。 –

+0

你怎麼知道這不是使用Python 3的問題? – martineau