我可以在python中使用库抽象吗?

时间:2013-02-20 20:55:54

标签: python windows python-3.x

我正在使用:

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

浏览目录。一切都很酷。但是,我在Windows 7上运行,当然它具有库抽象。例如,图片库可能会映射到c:\users\mec:\users\share 有什么方法可以使用python这个库抽象吗?

2 个答案:

答案 0 :(得分:3)

除非我对这个功能的工作方式有误(我实际上并没有在我面前安装Win7),否则你必须访问Windows Shell API才能访问库。

从MSDN杂志阅读Introducing Libraries,很明显只是处理文件系统的应用程序会将库视为一个常规目录,甚至没有任何关于构成图书馆。除非你总是坚持使用花哨的文件选择器对话框来获取所有路径(在这种情况下用户看到库,但总是最终选择一个特定的文件夹,所以你不必处理库),你必须明确使用shell API。

我认为您希望从Windows Libraries开始使用开发指南,并IShellLibrary作为参考。

这些显然是COM API,因此您可能希望使用win32com从Python访问它们。 (你可以使用ctypes并处理COM样式的C风格,但你真的不想这样做。)有可能有人已经在一个漂亮的Python界面中包装了这些COM对象 - 我没有在快速PyPI和ActiveState搜索中找到任何内容,但您可能想尝试更严肃的搜索。

或者,当然,您可以使用IronPython并使用.NET API而不是本机API。

答案 1 :(得分:0)

Pywin32(218)的最新版本支持shell库接口:

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)