variable for python windows application-data common-files

for - set environment variable python windows 10



¿Cómo encuentro la carpeta de datos de la aplicación común de Windows usando Python? (6)

De 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("~")

Para obtener el directorio de datos de la aplicación para todos los usuarios, en lugar del usuario actual, simplemente use shellcon.CSIDL_COMMON_APPDATA lugar de shellcon.CSIDL_APPDATA .

Me gustaría que mi aplicación almacene algunos datos para el acceso de todos los usuarios. Utilizando Python, ¿cómo puedo encontrar dónde deben ir los datos?


Eche un vistazo a http://ginstrom.com/code/winpaths.html . Este es un módulo simple que recuperará la información de la carpeta de Windows. El módulo implementa get_common_appdata para obtener la carpeta de datos de la aplicación para todos los usuarios.


Puede acceder a todas las variables de entorno de su sistema operativo utilizando el diccionario os.environ en el módulo os . Sin embargo, elegir qué clave usar de ese diccionario podría ser complicado. En particular, debe tener en cuenta las versiones internacionalizadas (es decir, que no están en inglés) de Windows al usar estas rutas.

os.environ[''ALLUSERSPROFILE''] debería proporcionarle el directorio raíz para todos los usuarios de la computadora, pero después de eso tenga cuidado de no codificar nombres de subdirectorios de código duro como "Datos de aplicación", ya que estos directorios no existen en versiones que no estén en inglés. de Windows. En este sentido, es posible que desee investigar un poco sobre qué versiones de Windows puede esperar tener configurada la variable de entorno ALLUSERSPROFILE (no me conozco, puede ser universal).

Mi máquina XP aquí tiene una variable de entorno COMMONAPPDATA que apunta a la carpeta Todos los usuarios / Datos de la aplicación, pero mi sistema Win2K3 no tiene esta variable de entorno.


Si no desea agregar una dependencia para un módulo de terceros como winpaths, recomendaría usar las variables de entorno ya disponibles en Windows:

Específicamente, es probable que desee que ALLUSERSPROFILE obtenga la ubicación de la carpeta de perfil de usuario común, que es donde reside el directorio de datos de la aplicación.

p.ej:

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

EDITAR : Mirando el módulo de winpaths, está usando ctypes, por lo que si solo desea usar la parte relevante del código sin instalar winpath, puede usar esto (obviamente se omite alguna verificación de errores por brevedad).

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

Ejecución de ejemplo:

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


Ya que SHGetFolderPath está en desuso, también puede usar SHGetKnownFolderPath en Vista y más reciente. Esto también te permite buscar más rutas que SHGetFolderPath. Aquí hay un ejemplo simplificado (código completo disponible en 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


La respuesta anterior se eliminó debido a la incompatibilidad con las versiones de Windows y Vista de los Estados Unidos.

EDITAR: Para expandir la respuesta de Out Into Space, usaría la función winpaths.get_common_appdata . Puede obtener winpaths usando easy_install winpaths o visitando la página pypi, http://pypi.python.org/pypi/winpaths/ , y descargando el instalador .exe.