如何使用PythonfindWindows常用应用程序数据文件夹?

我想我的应用程序存储一些数据供所有用户访问。 使用Python,我怎样才能find数据应该去的地方?

如果您不想为winpaths等第三方模块添加依赖项,我建议使用Windows中已经提供的环境变量:

  • Windows中有哪些环境变量可用?

具体而言,您可能希望ALLUSERSPROFILE获取常用用户配置文件文件夹的位置,这是Application Data目录所在的位置。

例如:

 C:\> python -c "import os; print os.environ['ALLUSERSPROFILE']" C:\Documents and Settings\All Users 

编辑 :看winpaths模块,它使用ctypes,所以如果你想只使用代码的相关部分,而不安装winpath,你可以使用这个(显然有一些错误检查省略,以简化)。

 import ctypes from ctypes import wintypes, windll CSIDL_COMMON_APPDATA = 35 _SHGetFolderPath = windll.shell32.SHGetFolderPathW _SHGetFolderPath.argtypes = [wintypes.HWND, ctypes.c_int, wintypes.HANDLE, wintypes.DWORD, wintypes.LPCWSTR] path_buf = wintypes.create_unicode_buffer(wintypes.MAX_PATH) result = _SHGetFolderPath(0, CSIDL_COMMON_APPDATA, 0, 0, path_buf) print path_buf.value 

示例运行:

 C:\> python get_common_appdata.py C:\Documents and Settings\All Users\Application Data 

http://snipplr.com/view.php?codeview&id=7354

 homedir = os.path.expanduser('~') # ...works on at least windows and linux. # In windows it points to the user's folder # (the one directly under Documents and Settings, not My Documents) # In windows, you can choose to care about local versus roaming profiles. # You can fetch the current user's through PyWin32. # # For example, to ask for the roaming 'Application Data' directory: # (CSIDL_APPDATA asks for the roaming, CSIDL_LOCAL_APPDATA for the local one) # (See microsoft references for further CSIDL constants) try: from win32com.shell import shellcon, shell homedir = shell.SHGetFolderPath(0, shellcon.CSIDL_APPDATA, 0, 0) except ImportError: # quick semi-nasty fallback for non-windows/win32com case homedir = os.path.expanduser("~") 

要获取所有用户的app-data目录,而不是当前用户,只需使用shellcon.CSIDL_COMMON_APPDATA而不是shellcon.CSIDL_APPDATA

看看http://ginstrom.com/code/winpaths.html 这是一个简单的模块,将检索Windows文件夹信息。 该模块实现get_common_appdata以获取所有用户的App Data文件夹。

您可以使用os模块中的os.environ字典来访问所有的OS环境变量。 但是,从字典中选择使用哪个键可能会非常棘手。 尤其是,在使用这些路径时,您应该保持对Windows的国际化版本(即非英文版本)的了解。

os.environ['ALLUSERSPROFILE']应为您提供计算机上所有用户的根目录,但在此之后请注意不要硬编码“Application Data”等子目录名称,因为这些目录在非英文版本中不存在的Windows。 对于这个问题,你可能想要对什么版本的Windows做一些研究,你可以设置ALLUSERSPROFILE环境变量(我不知道我自己 – 它可能是通用的)。

我的XP机器有一个COMMONAPPDATA环境变量,它指向All Users \ Application Data文件夹,但是我的Win2K3系统没有这个环境变量。

由于与美国版本的Windows和Vista不兼容,以前的答案被删除。

编辑:扩展到空间的答案,你会使用winpaths.get_common_appdata函数。 您可以使用easy_install winpaths或转到pypi页面http://pypi.python.org/pypi/winpaths/并下载.exe安装程序来获取winpath。

由于SHGetFolderPath已被弃用,您也可以在Vista和更高版本中使用SHGetKnownFolderPath 。 这也让你查找比SHGetFolderPath更多的路径。 这是一个精简的例子( 在Gist上提供完整的代码):

 import ctypes, sys from ctypes import windll, wintypes from uuid import UUID class GUID(ctypes.Structure): # [1] _fields_ = [ ("Data1", wintypes.DWORD), ("Data2", wintypes.WORD), ("Data3", wintypes.WORD), ("Data4", wintypes.BYTE * 8) ] def __init__(self, uuid_): ctypes.Structure.__init__(self) self.Data1, self.Data2, self.Data3, self.Data4[0], self.Data4[1], rest = uuid_.fields for i in range(2, 8): self.Data4[i] = rest>>(8 - i - 1)*8 & 0xff class FOLDERID: # [2] LocalAppData = UUID('{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}') LocalAppDataLow = UUID('{A520A1A4-1780-4FF6-BD18-167343C5AF16}') RoamingAppData = UUID('{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}') class UserHandle: # [3] current = wintypes.HANDLE(0) common = wintypes.HANDLE(-1) _CoTaskMemFree = windll.ole32.CoTaskMemFree # [4] _CoTaskMemFree.restype= None _CoTaskMemFree.argtypes = [ctypes.c_void_p] _SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath # [5] [3] _SHGetKnownFolderPath.argtypes = [ ctypes.POINTER(GUID), wintypes.DWORD, wintypes.HANDLE, ctypes.POINTER(ctypes.c_wchar_p) ] class PathNotFoundException(Exception): pass def get_path(folderid, user_handle=UserHandle.common): fid = GUID(folderid) pPath = ctypes.c_wchar_p() S_OK = 0 if _SHGetKnownFolderPath(ctypes.byref(fid), 0, user_handle, ctypes.byref(pPath)) != S_OK: raise PathNotFoundException() path = pPath.value _CoTaskMemFree(pPath) return path common_data_folder = get_path(FOLDERID.RoamingAppData) # [1] http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx # [2] http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457.aspx # [3] http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx # [4] http://msdn.microsoft.com/en-us/library/windows/desktop/ms680722.aspx # [5] http://www.themacaque.com/?p=954