¿Cómo encontrar el directorio de inicio del usuario real usando python?

Veo que si cambiamos la variable ambiental HOME (linux) o USERPROFILE (windows) y ejecutamos un script en python, devuelve el nuevo valor como el usuario home cuando lo intenté, os.environ [‘HOME’] os.exp

¿Hay alguna forma de encontrar el directorio de inicio del usuario real sin depender de la variable ambiental?

editar:
Aquí hay una forma de encontrar un usuario en Windows leyendo en el registro,
http://mail.python.org/pipermail/python-win32/2008-January/006677.html

editar:
Una forma de encontrar ventanas en casa usando pywin32,

from win32com.shell import shell,shellcon home = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0) 

Creo que os.path.expanduser(path) podría ser útil.

En Unix y Windows, devuelva el argumento con un componente inicial de ~ o ~user reemplazado por el directorio de inicio de ese usuario.

En Unix, una inicial ~ se reemplaza por la variable de entorno HOME si está configurada; de lo contrario, el directorio de inicio del usuario actual se buscará en el directorio de contraseñas a través del módulo incorporado pwd . Un ~user inicial se busca directamente en el directorio de contraseñas .

En Windows, se utilizará HOME y USERPROFILE si se establece, de lo contrario se utilizará una combinación de HOMEPATH y HOMEDRIVE . Un ~user inicial se maneja eliminando el último componente del directorio de la ruta de acceso del usuario creado derivada anteriormente .

Si la expansión falla o si la ruta no comienza con una tilde, la ruta se devuelve sin cambios.

Así que podrías hacer:

 os.path.expanduser('~user') 

Creo que os.path.expanduser(path) es la mejor respuesta a su pregunta, pero hay una alternativa que vale la pena mencionar en el mundo de Unix: el paquete pwd . p.ej

 import os, pwd pwd.getpwuid(os.getuid()).pw_dir 
 from pathlib import * str(Path.home()) 

Funciona en Python 3.5 y superior. Path.home() devuelve un objeto Path que proporciona una API que me parece muy útil.

home_folder = os.getenv('HOME')

Esto debería funcionar también en Windows y Mac OS, funciona bien en Linux.

Para ventanas;

 import os homepath = os.path.expanduser(os.getenv('USERPROFILE')) 

le dará un identificador del directorio de inicio del usuario actual y

 filepath = os.path.expanduser(os.getenv('USERPROFILE'))+'\\Documents\\myfile.txt' 

le dará un identificador a continuación del archivo;

 C:\Users\urUserName\Documents\myfile.txt 

Realmente, un cambio en la variable de entorno indica que la casa debe ser cambiada. Así que cada progtwig / script debe tener el nuevo hogar en contexto; También las consecuencias dependen de la persona que lo cambió. Todavía me quedaría con home = os.getenv('USERPROFILE') or os.getenv('HOME')

¿Qué se requiere exactamente?

Me doy cuenta de que esta es una pregunta antigua que ha sido respondida pero pensé que agregaría mis dos centavos. La respuesta aceptada no funcionaba para mí. Necesitaba encontrar el directorio de usuarios y quería que funcionara con y sin sudo . En Linux, mi directorio de usuario es “/ home / someuser” pero mi directorio raíz es “/ root /”. Sin embargo, en mi Mac, el directorio de usuario es “/ Users / someuser”. Esto es lo que terminé haciendo:

 _USERNAME = os.getenv("SUDO_USER") or os.getenv("USER") _HOME = os.path.expanduser('~'+_USERNAME) 

Esto funcionó con y sin sudo en Mac y Linux.

Obtener (traducido) los nombres de las carpetas de usuario en Linux:

 from gi.repository import GLib docs = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOCUMENTS) desktop = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DESKTOP) pics = GLib.get_user_special_dir(GLib.USER_DIRECTORY_PICTURES) videos = GLib.get_user_special_dir(GLib.USER_DIRECTORY_VIDEOS) music = GLib.get_user_special_dir(GLib.USER_DIRECTORY_MUSIC) downloads = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOWNLOAD) public = GLib.get_user_special_dir(GLib.USER_DIRECTORY_PUBLIC_SHARE) templates = GLib.get_user_special_dir(GLib.USER_DIRECTORY_TEMPLATES) print(docs) print(desktop) print(pics) print(videos) print(music) print(downloads) print(public) print(templates) 

En Linux y otros UNIXoids siempre puedes echar un vistazo a /etc/passwd . El directorio de inicio es el sexto campo separado por dos puntos de allí. Sin embargo, no tengo idea de cómo hacerlo mejor que la variable de entorno en Windows. Habrá una llamada al sistema para eso, pero si está disponible desde Python, …