3 votes

Trier les erreurs d'E/S de disque en Python

Comment puis-je trier une erreur provenant d'une "condition de disque plein" de celle de "tentative d'écriture sur un système de fichiers en lecture seule" ? Je ne veux pas remplir mon disque dur pour le découvrir :) Ce que je veux, c'est savoir comment attraper chaque exception, afin que mon code puisse afficher un message à l'utilisateur lorsqu'il essaie d'écrire sur un système de fichiers en lecture seule et un autre message si l'utilisateur tente d'écrire un fichier sur un disque plein.

10voto

Alex Martelli Points 330805

Une fois que vous attrapez IOError, par exemple avec une clause except IOError, e: en Python 2.*, vous pouvez examiner e.errno pour déterminer exactement de quel type d'erreur d'E/S il s'agissait (malheureusement d'une manière qui n'est pas nécessairement entièrement portable entre différents systèmes d'exploitation).

Voir le module errno dans la bibliothèque standard Python ; l'ouverture d'un fichier en écriture sur un système de fichiers en R/O (sur un OS sensé) devrait produire errno.EPERM, errno.EACCES ou mieux encore errno.EROFS ("système de fichiers en lecture seule"); si le système de fichiers est R/W mais qu'il n'y a plus d'espace vous devriez obtenir errno.ENOSPC ("plus d'espace disponible sur le périphérique"). Mais vous devrez expérimenter sur les OS qui vous intéressent (avec une petite clé USB en le remplissant devrait être facile ;-).

Il n'y a pas de moyen d'utiliser différentes clauses except en fonction du errno -- de telles clauses doivent être distinguées par la classe des exceptions qu'elles attrapent, et non par les attributs de l'instance d'exception -- donc vous aurez besoin d'un if/else ou d'un autre type de dispatching au sein d'une seule clause except IOError, e:.

2voto

ephemient Points 87003

Sur un système de fichiers en lecture seule, les fichiers eux-mêmes seront marqués comme en lecture seule. Toute tentative d'open un fichier en lecture seule pour écriture (O_WRONLY ou O_RDWR) échouera. Sur les systèmes de type UNIX, errno EACCES sera défini.

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

En revanche, les tentatives d'write dans un fichier complet peuvent entraîner ENOSPC. Peut être critique; l'erreur peut être retardée jusqu'à fsync ou close.

\>>> file([/dev/full](http://en.wikipedia.org/wiki//dev/full), 'a').write('\\n')
close failed in file object destructor:
IOError: \[Errno 28\] No space left on device

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X