En Python, comment puis-je vérifier si un lecteur existe w/o de lancer une erreur pour les lecteurs amovibles?
Voici ce que j'ai à ce jour:
import os.path as op
for d in map(chr, range(98, 123)): #drives b-z
if not op.isdir(d + ':/'): continue
Le problème est qu'il affiche un "Pas de Disque" zone d'erreur de Windows:
maya.exe - Pas de Disque: Il n'y a pas de disque dans
le lecteur. Veuillez insérer un disque dans
le lecteur \Device\Harddisk1\DR1 [Annuler, Essayez à Nouveau, Continuer]
Je ne peut pas attraper une exception, car il ne fait pas de jeter un Python d'erreur.
Apparemment, cela ne se produit que sur des lecteurs amovibles où il y a une lettre qui lui est attribuée, mais pas de disque inséré.
Est-il un moyen de contourner ce problème sans disant spécifiquement le script qui conduit à ignorer?
Dans mon scénario, je suis à l'école des laboratoires où les lettres de lecteur changer en fonction de l'ordinateur de test, je suis à la. Aussi, j'ai zéro des privilèges de sécurité pour accéder au gestionnaire de disque.
- Par la voie, nettoyant pour éviter de carte:
[chr(c) for c in xrange(98, 123)]
. C'est aussi sans doute plus clair de dire xrange(ord('b'), ord('z'))`. Aussi, ne pas sauter "Une"; rien n'indique qu'il doit être un lecteur de disquette. J'ai toujours désactiver le solde non utilisé contrôleur de lecteur de disquette, ce qui libère Un:. - Bon conseil! J'ai mis en place tout à l'heure avec le ord() la méthode que vous avez décrit. Fonctionne très bien!
- Je viens de remarquer que j'ai à mettre
ord('z') + 1
pour obtenir ce que ça va tout le chemin à z si.
Vous devez vous connecter pour publier un commentaire.
Utiliser le
ctypes
paquet pour accéder à laGetLogicalDrives
fonction. Cela ne nécessite pas de bibliothèques externes tels que pywin32, il est donc portable, même si elle est un peu moins agiles pour travailler avec. Par exemple:itertools.compress
a été ajouté dans Python 2.7 et 3.1; si vous avez besoin de soutien <2.7 ou <3.1, voici une implémentation de cette fonction:import platform
bien. aussi, c'est encore de retour des lecteurs amovibles pour lesquelles il n'y a pas de disque inséré. c'est en fait le problème ici est que je ne peut pas détecter si le lecteur dispose d'un disque chargé ou non w/o une erreur de quelque sorte.Voici une manière qui fonctionne à la fois sur Windows et Linux, pour Python 2 et 3:
vol
est une commande de Windows.os.system
en combinaison avec2>nul>nul
exécute la commande dans un silence, où seul le code de retour est utilisé. Si le code de retour est 0 (== 0
), puis il a travaillé.%s
est remplacé par la lettre de lecteur, de sorte que, par exemplevol c:
est en cours d'exécution. L'idée est de vérifier si cela renvoie une erreur ou pas.Si vous avez la win32file module, vous pouvez appeler GetLogicalDrives():
Pour désactiver le menu contextuel d'erreur, vous devez définir la
SEM_FAILCRITICALERRORS
Windows indicateur d'erreur à l'aide de pywin:Cela dit Win32 ne pas afficher la boîte de dialogue nouvelle tentative; lorsqu'une erreur se produit, il est renvoyé à l'application immédiatement.
Noter que c'est ce que Python appels sont censé à faire. En principe, Python devrait être la définition de ce drapeau pour vous. Malheureusement, depuis le Python peut être incorporé dans un autre programme, il ne peut pas le processus de changement à l'échelle des drapeaux comme ça, et Win32 n'a aucun moyen de spécifier ce drapeau d'une manière qui n'affecte que Python et pas le reste du code.
Aussi longtemps que un peu de l'analyse est acceptable, c'est une façon de le faire sans installer win32api et sans itération en passant par toutes les lettres de lecteur.
Vous pouvez également analyser pour certains types de lecteurs, tels que la "Connexion Réseau" pour obtenir une liste de tous les réseau monté lettres de lecteur en ajoutant
and lineSplit[2] == 'Network Connection'
par exemple.Alternativement, plutôt que de retourner une liste, vous pouvez retourner un dictionnaire, où les clés sont les lettres de lecteur et les valeurs sont des chemins d'accès unc (
lineSplit[3]
). Ou toute autre info que vous voulez tirer dewmic
. Pour voir plus d'options:wmic logicaldisk get /?