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.