Сортировка ошибок ввода-вывода на диске в Python - PullRequest
3 голосов
/ 12 июля 2009

Как мне разобраться (отличить) ошибку, полученную из "состояния диска в полном объеме" от "попытки записи в файловую систему только для чтения"? Я не хочу заполнять мой HD, чтобы узнать :) Я хочу знать, кто должен перехватывать каждое исключение, чтобы мой код мог что-то сказать пользователю, когда он пытается записать в ReadOnly FS, и другое сообщение, если пользователь пытается записать файл на заполненный диск.

Ответы [ 2 ]

10 голосов
/ 12 июля 2009

Как только вы поймаете IOError, например, с помощью предложения except IOError, e: в Python 2. * вы можете проверить e.errno, чтобы точно определить, какая именно это была ошибка ввода-вывода (к сожалению, не всегда полностью переносимая в разных операционных системах).

См. Модуль errno в стандартной библиотеке Python; открытие файла для записи в файловой системе R / O (в разумной ОС) должно привести к errno.EPERM, errno.EACCES или еще лучше errno.EROFS ("файловая система только для чтения"); если файловая система - R / W, но места не осталось, вы должны получить errno.ENOSPC («на устройстве не осталось места»). Но вам нужно будет поэкспериментировать с операционными системами, которые вас интересуют (с небольшим USB-ключом заполнение должно быть простым; -).

Нет способа использовать различные предложения except в зависимости от errno - такие предложения должны различаться классом исключений, которые они ловят, а не атрибутами экземпляра исключения - так что вы нужна отправка if / else или другой вид в пределах одного except IOError, e: предложения.

2 голосов
/ 12 июля 2009

В файловой системе только для чтения сами файлы будут помечены как доступные только для чтения. Любая попытка open файла только для чтения для записи (O_WRONLY или O_RDWR) потерпит неудачу. В UNIX-подобных системах будет установлено значение EACCES.

>>> file('/etc/resolv.conf', 'a')
Traceback (most recent call last):
  File "", line 1, in 
IOError: [Errno 13] Permission denied: '/etc/resolv.conf'

Напротив, попытки write к полному файлу могут привести к ENOSPC. май критический; ошибка может быть отложена до fsync или close.

>>> file(<a href="http://en.wikipedia.org/wiki//dev/full" rel="nofollow noreferrer">/dev/full</a>, 'a').write('\n')
close failed in file object destructor:
IOError: [Errno 28] No space left on device
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...