2013-02-20 2 views
5

Ich verwende:Kann ich Bibliotheksabstraktionen in Python verwenden?

for root, dirs, files in os.walk(rootDir): 

Verzeichnisse zu navigieren. Alles cool. Ich laufe jedoch auf Windows 7, die natürlich die Bibliothek Abstraktion hat. So könnte zum Beispiel die Bildbibliothek zu c:\users\me und c:\users\share zuordnen Gibt es eine Möglichkeit, wie ich diese Bibliothek Abstraktion mit Python verwenden kann?

+0

gut, wenn Sie nur mit einem „r '“ vor Python sortiert es out; wie Datei = r'C: \ users \ me ' –

+0

Wenn Sie 'os.listdir()' auf einer Bibliotheksabstraktion verwenden können, können Sie auch 'os.walk()' darauf verwenden. –

+3

@BHM: Ich denke nicht das 'r' ist das Problem hier. – abarnert

Antwort

3

Wenn ich nicht falsch darüber bin, wie diese Funktion funktioniert (ich habe eigentlich keine Win7-Box vor mir), müssen Sie auf die Windows Shell-APIs zugreifen, um auf Bibliotheken zugreifen zu können.

Lesen von Introducing Libraries von MSDN Magazine, es scheint ziemlich klar, dass Apps, die nur mit dem Dateisystem befassen eine Bibliothek als nur ein normales Verzeichnis, und nicht einmal eine Anzeige der verschiedenen verstreuten Verzeichnisse, die die Bibliothek bilden. Es sei denn, Sie bleiben immer bei den komplizierten Dateiauswahldialogen, um alle Pfade zu erhalten (in welchem ​​Fall der Benutzer Bibliotheken sieht, aber immer einen bestimmten Ordner auswählt, so dass Sie sich nicht mit Bibliotheken beschäftigen müssen), müssen Sie explizit verwenden die Shell-APIs.

Ich denke, Sie wollen bei Windows Libraries für die Dev-Anleitung und IShellLibrary für die Referenz starten.

Dies sind offensichtlich COM-APIs, also sollten Sie wahrscheinlich win32com verwenden, um von Python darauf zuzugreifen. (Sie könnten ctypes verwenden und mit dem COM-Zeug C-style umgehen, aber das wollen Sie wirklich nicht.) Es ist möglich, dass jemand diese COM-Objekte bereits in einer netten Python-Schnittstelle eingepackt hat - ich habe nichts schnell gefunden PyPI und ActiveState suchen, aber Sie möchten vielleicht eine ernstere Suche versuchen.

Alternativ können Sie natürlich auch IronPython verwenden und die .NET-APIs anstelle der nativen verwenden.

0

Die jüngste Version von pywin32 (218) hat Unterstützung für das Shell-Bibliothek Schnittstellen:

import pythoncom 
from win32com.shell import shell, shellcon 
from win32com import storagecon 
import os 

kfm = pythoncom.CoCreateInstance(shell.CLSID_KnownFolderManager, None, 
     pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IKnownFolderManager) 
libs_folder = kfm.GetFolder(shell.FOLDERID_Libraries) 
libs_path = libs_folder.GetPath() 

for lib_file in os.listdir(libs_path): 
    if os.path.splitext(lib_file)[1] == '.library-ms': 
     print lib_file 
     i = shell.SHCreateItemFromParsingName(os.path.join(libs_path, lib_file), 
               None, shell.IID_IShellItem) 
     lib = pythoncom.CoCreateInstance(shell.CLSID_ShellLibrary, None, 
             pythoncom.CLSCTX_INPROC, shell.IID_IShellLibrary) 
     lib.LoadLibraryFromItem(i, storagecon.STGM_READ) 
     for folder in lib.GetFolders(): 
      print '\t' + folder.GetDisplayName(shellcon.SHGDN_FORPARSING) 
Verwandte Themen