2013-02-20 42 views
5

我使用:我可以在python中使用庫抽象嗎?

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

您瀏覽的目錄。很酷。但是,我在Windows 7上運行,這當然有圖書館抽象。因此,例如圖片庫中可能會映射到c:\users\mec:\users\share 有什麼辦法,我可以使用這個庫抽象與Python?

+0

好,如果你只是在前面的蟒蛇種類它增加一個「R'」; 像文件= R'C:\用戶\我」 – 2013-02-20 20:59:54

+0

如果你能做到'os.listdir()'對庫抽象,你可以用'os.walk()'就可以了。 – 2013-02-20 21:02:47

+3

@BHM:我不認爲'r'是這裏的問題。 – abarnert 2013-02-20 21:02:48

回答

3

除非我錯了有關此功能的工作(我實際上沒有在我面前一個Win7的框),你將需要訪問Windows Shell中的API,以訪問庫。

從MSDN雜誌中讀取Introducing Libraries,似乎很清楚,處理文件系統的應用程序會將庫視爲常規目錄,甚至沒有任何指示組成庫的各個分散目錄。除非您始終堅持花哨的文件選擇器對話框來獲取所有路徑(在這種情況下,用戶可以看到庫,但總是選擇一個特定的文件夾,因此您不必處理庫),您必須明確地使用shell API。

我想你想開始Windows Libraries爲開發指南和IShellLibrary供參考。

這些顯然COM API的,所以你可能想使用win32com從Python的訪問它們。 (你可以使用​​,處理COM的東西C風格,但你真的不想)。有人可能已經把這些COM對象封裝在一個漂亮的Python接口中 - 我沒有發現任何東西PyPI和ActiveState搜索,但您可能想嘗試更嚴肅的搜索。

或者,當然,你可以使用IronPython和使用.NET的API,而不是那些原生的。

0

最近Pywin32的版本(218)具有殼庫接口支持:

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) 
相關問題