Frage

Problem:Die Verwendung von „shutil.copy()“ zum Kopieren einer Datei in ein FAT16-gemountetes Dateisystem unter Linux schlägt fehl (Python 2.7.x).Der Fehler ist ein interner Shutil-Fehler und schlägt tatsächlich bei Shutil.chmod fehl, das Shutil.copy anscheinend ausführt.

Shell chmod schlägt ebenfalls fehl, da Berechtigungen in FAT nicht unterstützt werden.

Fragen:Gibt es einen guten Weg, dies zu umgehen?Ich weiß, dass ich mehrere Möglichkeiten habe, zum Beispiel:

  1. Verwenden Sie copyfile – nicht ideal, da hierfür der vollständige Pfad und nicht nur das Zielverzeichnis erforderlich ist, aber machbar
  2. Führen Sie Shell cp aus, um Dateien zu kopieren
  3. Schreiben Sie eine eigene Kopierfunktion, die nicht versucht, den Dateimodus zu ändern

Gibt es eine Möglichkeit, dies in Python ODER in den FAT-Mount-Optionen zu umgehen?Ich mounte jetzt das Dateisystem in meinem Programm, indem ich mount -t vfat -o umask=000 /dev/loop0 /mnt/foo ausführe

Das Abfangen der Ausnahme hilft nicht, da die Ausnahme innerhalb von „shutil.copy“ auftritt und „shutil.copy()“ die Zieldatei zu löschen scheint, wenn „IOException“ von „shutil.chmod()“ abgefangen wird, bevor „IOException“ an die aufrufende Funktion übergeben wird.

Irgendwelche Ideen, oder sollte ich einfach eine von 1-3 auswählen?

Hannu

War es hilfreich?

Lösung

Nun ja, ich schummele in diesem Fall.

Wenn ich weiß, dass das Ziel ein Dateisystem ist, wo chmod schlägt fehl, ich lösche einfach die chmod Methode aus dem OS-Paket mit del os.chmod, und dadurch gelingt der Kopiervorgang.

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

Dies ermöglicht Ihnen nun, den Kopiervorgang durchzuführen, ohne dass ein Fehler im chmod auftritt.Dann aktivieren wir es wieder, indem wir das Attribut wieder zuweisen.

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

Andere Tipps

Verwenden shutil.copyfile, es ist kein vollständiger Pfad erforderlich.

Löschen os.chmod global ist nicht eine gute Idee.

$ 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 ./

Wie Sie im Python-Quellcode von Shutil sehen können (/usr/lib/python2.7/shutil.py) gibt es keine Pfadbetrachtung (relativ/absolut). copy Quellcode, der src Variable wird direkt als Argument von übergeben 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top