Питон shutil.ошибка копирования в файловых системах FAT (Ubuntu)

проблема: использование shutil.copy () для копирования файла в файловую систему FAT16 в Linux не удается (Python 2.7.икс.) Сбой-внутренняя ошибка shutil и сбой на самом деле на shutil.чмод, который shutil.копия, кажется, выполняется.

Shell chmod также терпит неудачу, поскольку разрешения не поддерживаются в FAT.

вопросы: есть ли аккуратный способ обойти это? Я знаю, что у меня есть несколько вариантов, например:

  1. использовать copyfile-не идеально, поскольку для этого требуется полный путь, не только целевой каталог, но и выполнимый
  2. выполнить оболочку cp для копирования файлов
  3. написать собственную функцию копирования, которая не пытается изменить режимы файл

есть ли способ обойти это в Python или в fat mount options? Теперь я монтирую файловую систему внутри своей программы, выполнив mount-t vfat-o umask=000 /dev/loop0 /mnt/foo

поймать исключение не помогает, так как исключение происходит внутри shutil.копирование и shutil.copy (), похоже, удаляет цель файл, когда он ловит IOException от shutil.chmod (), перед передачей IOException вызывающей функции.

какие-то идеи, или я должен просто выбрать один из 1-3?

Ханну

2 ответов


Ну я жульничаю в этом случае.

если я знаю, что целью является файловая система, где chmod не удается, я просто удаляю chmod метод из пакета ОС с помощью del os.chmod, и это позволяет копии успешно.

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

теперь это позволяет выполнять копирование без сбоев на chmod. Затем мы снова включаем его, назначая атрибут обратно.

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

использовать shutil.copyfile, он не требует полный путь.

удаление os.chmod во всем мире не хорошая идея.

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

как вы можете видеть в исходном коде python shutil (/usr/lib/python2.7/shutil.py), нет никакого рассмотрения пути (относительного/абсолютного) в copy исходный код src переменной передается в качестве аргумента 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)