2017-07-07 11 views
10

Si j'utilise ce qui suit pour obtenir la liste de tous les lecteurs connectés:Python 2: obtenir le chemin de partage réseau de lettre de lecteur

available_drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)] 

Comment puis-je obtenir le chemin UNC des disques connectés?

os.path juste retourne z:\ au lieu de

+0

Note: Je n'ai pas essayé d'exécuter cela. https://docs.python.org/2/library/os.path.html Sur la base de ceci, "Note sur Windows, beaucoup de ces fonctions ne supportent pas correctement les noms de chemins UNC: splitunc() et ismount() les gèrent correctement ". os.path.splitunc (chemin) Divise le chemin du chemin en une paire (unc, rest) de sorte que unc soit le point de montage UNC (tel que r '\\ host \ mount'), s'il est présent, et repose le reste du chemin (tel que r '\ path \ file.ext'). Pour les chemins contenant des lettres de lecteur, unc sera toujours la chaîne vide. – prashanth

+0

Essayez la bibliothèque suivante dans l'article du blog. http://developer.covenanteyes.com/unc-paths-with-python/ Le lien vers la bibliothèque http://covenanteyes.github.io/py_win_unc/ – prashanth

+0

fait un moment que je l'ai fait, mais iirc la façon dont j'ai trouvé est d'appeler 'net show' (sp?) et d'analyser la sortie ... ne pas avoir de machines Windows à proximité pour l'essayer maintenant ... –

Répondre

6

Utilisez win32wnet de pywin32 pour convertir vos lettres de lecteur. Par exemple:

import win32wnet 
import sys 

print(win32wnet.WNetGetUniversalName(sys.argv[1], 1)) 

Cela me donne quelque chose comme ça quand je le lance:

C:\test>python get_unc.py i:\some\path 
\\machine\test_share\some\path 
0

En utilisant ctypes et le code indiqué dans la première réponse dans ce post: Get full computer name from a network drive letter in python, il est possible d'obtenir les chemins d'entraînement pour chaque lecteur réseau, ou quelques sélectionnés.

La fonction get_connection donnée jetteront une erreur si le lecteur est pas un lecteur réseau, que ce soit des lecteurs locaux ou amovibles, cela peut être pris en compte avec

# your drive list 
available_drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)] 
for drive in available_drives: 
    try: 
     # function from linked post 
     print(get_connection(drive)) 
    except WindowsError: # thrown from local drives 
     print('{} is a local drive'.format(drive))