3 votes

erreur de shutil samefile sous Linux

J'ai un script python qui me donne du fil à retordre sur Ubuntu 12.02 avec Python 2.7.3.

PS : il fonctionne sans problème sous 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

Vérification de certaines propriétés des fichiers :

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

Comme vous le voyez, appeler shutil._samefile Je reçois False mais shutil.copy soulèvent encore le samefile error .

Est-ce que j'oublie quelque chose ? Y a-t-il un autre moyen de déplacer ou de copier des fichiers avec Python ?

2voto

Brendan Abel Points 3745

Il semble que les deux fichiers soient des liens directs vers le même fichier. Vous pouvez le dire car ils partagent le même numéro d'inode.

st_ino=4913809333

Les utilisateurs de Windows ne créent généralement pas de liens physiques. Ils sont plus courants dans les environnements linux, ce qui explique pourquoi vous n'avez peut-être pas rencontré le problème jusqu'à présent.

C'est étrange que samefile renvoie à False . Quel système d'exploitation utilisez-vous ? shutil._samefile est juste une enveloppe autour de os.path.samefile (sur les systèmes où cette fonction existe). Quels résultats obtenez-vous avec os.path.samefile ? Sur les systèmes posix, il vérifie simplement que le périphérique et l'inode correspondent (ce qui est le cas dans votre cas) et il devrait renvoyer 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

0voto

Adam Przedniczek Points 182

Sur python 3 dans shutil.copy il y a un argument supplémentaire follow_symlinks=True Regardez ceci https://docs.python.org/3/library/shutil.html

Si follow_symlinks est false, et que src est un lien symbolique, dst sera créé comme un lien symbolique. Si follow_symlinks est true et que src est un lien symbolique, dst sera une copie du fichier auquel src fait référence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X