Удаление дерева на USB-устройстве в Python

Я использовал следующий код для удаления дерева на USB-устройстве, но получаю сообщение об ошибке OSError:

Я также запускал код с помощью sudo python.

импортный шутил

импорт ОС

источник = /медиа/устройство/моя_папка

если os.path.exists(dst):

shutil.rmtree(dst)

Я только что использовал Shutil.copytree(src, dst) в другом скрипте для записи файлов на устройство в первую очередь. Однако USB-устройство было удалено во время копирования, это, вероятно, вызывает проблему, с которой я сталкиваюсь, поскольку все остальные файлы, кроме того, который был скопирован наполовину, были удалены в порядке.

Я получаю следующую трассировку:

Traceback (most recent call last):
  File "writetousb/tests/deleteTest.py", line 32, in <module>
    shutil.rmtree(src)
  File "/usr/lib/python2.7/shutil.py", line 252, in rmtree
    onerror(os.remove, fullname, sys.exc_info())
  File "/usr/lib/python2.7/shutil.py", line 250, in rmtree
    os.remove(fullname)
OSError: [Errno 30] Read-only file system: '/media/device/21823/21916.jpg'

Итак, я предполагаю, что мне нужно будет изменить права доступа к папке и ее файлам, прежде чем я их удалю?


person Cephlin    schedule 29.08.2013    source источник
comment
Возможно, у вас нет прав на удаление. Показать полную трассировку.   -  person Denis    schedule 29.08.2013
comment
@Denis Позвольте мне получить отслеживание для вас сейчас.   -  person Cephlin    schedule 29.08.2013
comment
Хм. Файловая система только для чтения обычно означает, что диск смонтирован с флагом «ro» или смонтирован с правами на запись только для определенного пользователя. Вы должны убедиться, что вы можете записывать файлы на диск с помощью сенсорного экрана, когда вы вошли в систему с пользователем, который запустил скрипт Python.   -  person Gabriel Samfira    schedule 29.08.2013
comment
Хорошо, еще одно обновление. После нажатия на файл я повторно запустил скрипт, и он заработал нормально! Я, вероятно, просто пройдусь по папке и коснусь всех файлов, используя вызов из подпроцесса (если нет лучшего способа вызвать touch из python). Затем запустите Shutil.rmtree.   -  person Cephlin    schedule 29.08.2013
comment
Хорошо, у меня есть решение, но я не могу публиковать его еще 8 часов из-за своей репутации. Я опубликую это как можно скорее.   -  person Cephlin    schedule 29.08.2013


Ответы (1)


Если я использую chmod для правильной установки разрешений, прежде чем пытаться использовать Shutil.rmtree, тогда это должно работать. Я собираюсь протестировать это и предоставить обновление, когда я знаю, что это работает.

Я могу подтвердить, что решение работает.

import shutil
import os

src = "/media/device/my_folder"

if os.path.exists(dst):
    os.chmod(dst, 0o777)
    for root,dirs,_ in os.walk(dst):
        for d in dirs :
            os.chmod(os.path.join(root,d) , 0o777)
    shutil.rmtree(dst)
person Cephlin    schedule 30.08.2013