9
votes

En Python, comment vérifier si un lecteur existe avec une erreur pour des lecteurs amovibles?

Voici ce que j'ai jusqu'à présent:

import os.path as op
for d in map(chr, range(98, 123)): #drives b-z
    if not op.isdir(d + ':/'): continue


3 commentaires

Au fait, nettoyeur pour éviter la carte: [chr (ch) pour C en xrange (98, 123)] . Il est également sans doute plus clair de dire Xrange (Ord ('B'), ORD ('Z')) `. En outre, ne sautez pas "A"; Rien ne dit que cela doit être un lecteur de disquette. Je désactive toujours le contrôleur de disquette non utilisé, qui libère un:


Très bon conseil! Je l'ai mis en œuvre juste maintenant avec la méthode ORD () que vous avez décrite. Fonctionne très bien!


Je viens de remarquer que je dois mettre ord ('z') + 1 pour que cela va tout le chemin à z cependant.


7 Réponses :


3
votes

Pour désactiver la fenêtre contextuelle d'erreur, vous devez définir le drapeau d'erreur SEM_FailCriticalErrors CODE> Windows à l'aide de PYWIN:

old_mode = win32api.SetErrorMode(0)
SEM_FAILCRITICALERRORS = 1 # not provided by PyWin, last I checked
win32api.SetErrorMode(old_mode & 1)


1 commentaires

Malheureusement, bien que je testais cela sur Windows 7, j'essaie de faire cette plate-forme de script. De plus, on dirait que le Win32API a besoin d'une construction différente selon le type de processeur que vous avez et je devrais installer chacune de ces constructions pour rendre cette compatibilité. Ai-je tort?



4
votes

Si vous avez le module win32file , vous pouvez appeler getLogicalDrives () : xxx


6 commentaires

J'aime cette approche; Cependant, je cherche une manière croisée de la plate-forme de le faire, car mon script sera potentiellement exécuté sur Maya via Windows / Mac / Linux.


@sfjedi, je suis curieux de savoir comment maya émule des lettres de conduite sur Linux :)


Bon appel. Je n'ai jamais rien développé pour Linux encore, mais je ne me sens tout simplement pas à l'aise de descendre une route spécifique à Windows. Je sais que Maya court sur Linux cependant, c'est pourquoi je suis relativement préoccupé. Vous montrez un bon point cependant. J'ai besoin de penser plus sur la structure de répertoire sur Linux. En fait, j'essaie spécifiquement d'identifier les clichés flash qui sont branchés avec un dossier "école" sur la racine. C'est le but réel de ce script.


BTW, j'aime comment vous allez au-delà et au-delà de répondre à la vraie question.


Cela ne fonctionnera pas dans tous les systèmes d'exploitation de différentes plateformes


@Heasyearnacademy, la question est étiquetée [Windows] , alors je ne comprends pas ce que le problème est. Pour ce que ça vaut la peine, la réponse acceptée cible également Windows uniquement.



6
votes

Voici une manière qui fonctionne à la fois sur Windows et Linux, pour Python 2 et 3:

import platform,os
def hasdrive(letter):
    return "Windows" in platform.system() and os.system("vol %s: 2>nul>nul" % (letter)) == 0


6 commentaires

Ummm ... Je ne vois rien à faire avec Linux là-bas.


Néanmoins, cela est vraiment extrêmement utile pour mes besoins. Vous savez-vous d'un moyen de supprimer la couverture de commandement?


@sfjedi: voir ma réponse ( Stackoverflow.com/Questtions/4188326/... ) pour un façon de faire cela sans une coquille de commandement.


MATT JOOKER: La fonction HasDrive fonctionne également sur Linux (renvoie False, comme Linux n'a pas de lettres d'entraînement)


J'espérais avoir des informations sur ce que "os.System (" vol% S: 2> nul> nul "% (lettre)) == 0" réellement. J'ai du mal à comprendre.


Dylan, vol est une commande Windows. OS.System En combinaison avec 2> Nul> Nul exécute la commande de manière silencieuse, où seul le code de retour est utilisé. Si le code de retour est 0 ( == 0 ), il a fonctionné. % s est remplacé par la lettre de lecteur, de sorte que, par exemple, vol c: est en cours d'exécution. L'idée est de vérifier si cela renvoie une erreur ou non.



8
votes

Utilisez le CTYPES package pour accéder à la < un href = "http://msdn.microsoft.com/en-us/library/aa364972%28v=vs.85%29.aspx" rel = "nfollow noreferrer"> getLogicalDrives fonction. Cela ne nécessite pas de bibliothèques externes telles que PYWIN32, il est donc portable, bien qu'il s'agisse d'un peu plus encombrant de travailler. Par exemple: xxx

itoTools.Compress a été ajouté à Python 2.7 et 3.1; Si vous devez prendre en charge <2.7 ou <3.1, voici une implémentation de cette fonction: xxx


2 commentaires

Ah, tu es un saint! N'oubliez pas de plate-forme d'importation cependant. En outre, il retourne toujours des lecteurs amovibles pour lesquels il n'y a pas de lecteur inséré. C'est en fait le problème ici est que je ne puisse pas détecter si le lecteur dispose d'un disque chargé ou non d'une erreur d'une sorte.


Mise à jour - Semestre de printemps a commencé cette semaine et j'ai eu la chance de tester cela à l'école. Tout fonctionne bien sans hoquet, mais je dois essayer quelques machines de plus avant de voir si cela fonctionne vraiment avec la fenêtre contextuelle.



0
votes

Tant que un petit analysement est acceptable, il s'agit d'une façon de le faire sans installer Win32api et sans itération à travers toutes les lettres d'entraînement possibles.

from subprocess import check_output
def getDriveLetters():
    args = [
        'wmic',
        'logicaldisk',
        'get',
        'caption,description,providername',
        '/format:csv'
    ]
    output = check_output(args)
    results = list()
    for line in  output.split('\n'):
        if line:
            lineSplit = line.split(',')
            if len(lineSplit) == 4 and lineSplit[1][1] == ':':
                results.append(lineSplit[1][0])
    return results


0 commentaires

1
votes
import os

possible_drives_list = [chr(97 + num).upper() for num in range(26)]

for drive in possible_drives_list:
    print(drive + ' exists :' + str(os.path.exists(drive + ':\\')))

0 commentaires

0
votes
import os 
def IsDriveExists(drive):
    return os.path.exists(drive + ':\\')
    
print(IsDriveExists('c')) 
print(IsDriveExists('d'))
print(IsDriveExists('e'))
print(IsDriveExists('x'))
print(IsDriveExists('v'))
this works in any os

0 commentaires