Question

Problème:L'utilisation deshutil.copy() pour copier un fichier sur un système de fichiers monté en FAT16 sous Linux échoue (Python 2.7.x).L'échec est une erreur interne de Shutil et un échec en fait sur Shutil.chmod, que Shutil.copy semble exécuter.

Shell chmod échoue également, car les autorisations ne sont pas prises en charge dans FAT.

Des questions:Existe-t-il un moyen efficace de contourner ce problème ?Je sais que j'ai plusieurs options, par exemple :

  1. Utiliser copyfile - pas idéal car il nécessite un chemin complet, pas seulement le répertoire cible, mais faisable
  2. Exécutez shell cp pour copier des fichiers
  3. Écrire sa propre fonction de copie qui n'essaie pas de modifier les modes de fichier

Existe-t-il un moyen de contourner ce problème en Python OU dans les options de montage FAT ?Je monte maintenant le système de fichiers dans mon programme en exécutant mount -t vfat -o umask=000 /dev/loop0 /mnt/foo

Attraper l'exception n'aide pas, car l'exception se produit dans Shutil.copy et Shutil.copy() semble supprimer le fichier cible lorsqu'il attrape IOException de Shutil.chmod(), avant de transmettre IOException à la fonction appelante.

Des idées, ou dois-je simplement en choisir une parmi 1 à 3 ?

Hanou

Était-ce utile?

La solution

Eh bien, je triche dans ce cas.

Si je sais que la cible est un système de fichiers où chmod échoue, je supprime simplement le chmod méthode du package os en utilisant del os.chmod, et cela permet à la copie de réussir.

>>> import os
>>> print hasattr(os, 'chmod')
True
>>> foo = os.chmod
>>> del os.chmod
>>> print hasattr(os, 'chmod')
False

Cela permet désormais d'effectuer la copie sans échouer sur le chmod.Ensuite, nous le réactivons en réattribuant l'attribut.

>>> setattr(os, 'chmod', foo)
>>> print hasattr(os, 'chmod')
True

Autres conseils

Utiliser shutil.copyfile, il ne nécessite pas de chemin complet.

Suppression os.chmod à l'échelle mondiale est pas une bonne idée.

$ mkdir folder
$ touch folder/a
$ python2.7 -c 'import shutil; shutil.copyfile("folder/a","folder/b")'
$ ls -rthla folder/
total 0
drwxr-xr-x+ Apr 17 12:49 ../
-rw-r--r--  Apr 17 12:49 a
-rw-r--r--  Apr 17 12:50 b
drwxr-xr-x+ Apr 17 12:50 ./

Comme vous pouvez le voir dans le code source python de Shutil (/usr/lib/python2.7/shutil.py), il n’y a pas de considération de chemin (relatif/absolu) dans le copy code source, le src la variable est directement passée en argument de copyfile.

def copy(src, dst):
    """Copy data and mode bits ("cp src dst").

    The destination may be a directory.

    """
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    copyfile(src, dst)
    copymode(src, dst)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top