2016-06-07 13 views
3

Ich habe ein Python-Skript, das mir eine harte Zeit auf Ubuntu 12.02 mit Python 2.7.3.shuttil samefile Fehler unter Linux

PS: Es läuft ohne Probleme auf 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 

Überprüfung einige Eigenschaften der Dateien:

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

Wie Sie sehen, shutil._samefile Aufruf ich False aber shutil.copy noch die samefile error erhöhen.

Vergesse ich etwas? Jede andere Möglichkeit, Dateien mit Python zu verschieben oder zu kopieren?

+0

Sie müssen sie nicht kopieren. Sie sind zwei verschiedene Verzeichniseinträge, die auf dieselbe Datei verweisen. Da es sich um die gleiche Datei handelt, kann ihr Inhalt nicht abweichen. –

+0

(Warum 'shuthil._samefile' False zurückgibt, ist eine andere Frage und vielleicht etwas, um einen Bug zu überschreiben, aber da' st_dev' und 'st_ino' identisch sind, steht außer Frage, dass es sich um den gleichen Inhalt handelt, auf den beide verweisen Verzeichniseinträge). –

+1

@vmenezes Das erste Argument der Kopie in der ersten Box enthält den Tauchgang von Laufwerk, ist es nur Tippfehler? –

Antwort

2

Es sieht so aus, als ob die beiden Dateien beide feste Verbindungen zu derselben Datei sind. Sie können sagen, weil sie die gleiche Inode-Nummer teilen

st_ino=4913809333 

Windows-Benutzer erstellen im Allgemeinen keine festen Links. Sie kommen häufiger in Linux-Umgebungen vor, weshalb Sie das Problem bis jetzt nicht kennen.

Es ist seltsam, dass samefileFalse zurückgibt. Welches Betriebssystem verwenden Sie? shutil._samefile ist nur ein Wrapper um os.path.samefile (auf Systemen, wo diese Funktion existiert). Welche Ergebnisse erhalten Sie von os.path.samefile? Auf POSIX-Systemen, prüft es nur, dass das Gerät und inode Spiel (die sie in Ihrem Fall zu tun) und es sollte 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

Es ist wahrscheinlich, dass eines oder beide der übergeordneten Verzeichnisse Symlinks zu demselben Verzeichnis sind. – tdelaney

+0

@tdelaney Aber 'samefile' sollte in diesem Fall immer 'True' zurückgeben, oder? –

+0

Ja, ich bin genauso verwirrt wie du. Wie bei einer harten Verbindung sollten Dev und Inode gleich sein. – tdelaney

0

In Python 3 in shutil zurückzukehren. kopieren gibt es zusätzliches Argument follow_symlinks = true Schauen Sie sich das https://docs.python.org/3/library/shutil.html

Wenn follow_symlinks falsch ist, und src ist ein symbolischer Link, wird dst sein cr als symbolische Verbindung Wenn follow_symlinks wahr ist und src ein symbolischer Link ist, wird dst eine Kopie der Datei sein, auf die src verweist.

+0

Beantwortet nicht die Frage von OP zu Python 2.7.3. – martineau

+0

@martineau Aber möglicherweise prüfen, wie es in Python 3 funktioniert, könnte feststellen, ob das das Problem ist. Wenn ja, könnte er sich vielleicht die Quelle der neueren Version ansehen und diesen Code kopieren. –

+0

Woher wissen Sie, dass es kein Problem mit Python 3 ist? – martineau