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

81

Veo que si cambiamos la variable de entorno HOME (linux) o USERPROFILE (windows) y ejecutamos un script de Python, devuelve el nuevo valor como el usuario en casa 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 de entorno?

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

editar:
una forma de encontrar Windows Home usando pywin32,

from win32com.shell import shell,shellcon
home = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0)
asdfg
fuente
Es posible que desee verificar el comando Unix (acceso directo): lo ~userlleva al directorio de inicio del usuario actual. En las ventanas no tengo ni idea.
mAm
Esto debería estar marcado como un duplicado de ¿Cómo obtener el directorio de inicio en Python? ya que la respuesta aceptada de esa pregunta funciona en Python 3 y esta pregunta no.
Dour High Arch

Respuestas:

96

Creo que os.path.expanduser(path)podría ser de ayuda.

En Unix y Windows, devuelva el argumento con un componente inicial ~ o ~userreemplazado 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 busca en el directorio de contraseñas a través del módulo incorporado pwd. Una inicial ~userse busca directamente en el directorio de contraseñas .

En Windows, se usarán HOME y USERPROFILE si están configurados; de lo contrario, se utilizará una combinación de HOMEPATH y HOMEDRIVE . Una inicial ~userse maneja quitando el último componente de directorio de la ruta de usuario creada derivada anteriormente .

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

Entonces podrías hacer:

os.path.expanduser('~user')
Felix Kling
fuente
3
Es cierto, pero cambiar la variable de entorno como en la pregunta también "engañará" a este método. Ahora, por qué querría uno hacer eso, no puedo decirlo. :)
Jakob Borg
1
@calmh: Sí, lo cambié para usar el '~user'que debería funcionar en Linux y Windows (aquí no estoy 100% seguro porque no tengo Windows para probarlo;)).
Felix Kling
1
Esto funciona en Linux, pero no en Windows. En Windows, simplemente une "C: \ Documents and settings" al nombre de usuario pasado.
asdfg
Esto no resuelve el problema de que la variable "INICIO" sea incorrecta. Consulte cadence.com/Community/forums/t/17969.aspx por ejemplo
endolith
1
@asdfg: Me parece que funcionó correctamente. Pero yo también pensé que había fallado la primera vez que lo intenté, porque al principio estaba pasando la cadena literal '~ usuario' (que realmente debe ser algo literal como '~ Bob') en lugar de solo '~' (que anexa el usuario actual).
Jon Coombs
17

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

import os, pwd

pwd.getpwuid(os.getuid()).pw_dir
Brian M. Hunt
fuente
1
Esto es útil cuando desea el directorio de inicio del usuario, pero la variable de entorno HOME está configurada incorrectamente. Como señaló el autor, no es independiente de la plataforma, sino más bien para UNIX, no para Windows.
user1071847
1
Esto es mejor que confiar en la variable env de HOME que puede o no conservarse en las llamadas sudo. Por ejemplo HOME env. La variable está configurada para el usuario de destino en Debian 8 ('sudo' actúa como 'sudo -H') pero se conserva en Ubuntu 16 ('sudo' actúa como 'sudo -E')
Andrei Korostelev
16
from pathlib import *

str(Path.home())

funciona en Python 3.5 y superior. Path.home()devuelve un Pathobjeto que proporciona una API que encuentro muy útil.

Julius Kunze
fuente
1
Internamente, pathlibtodavía se basa en variables de entorno, por lo que esto no responde a su pregunta específica. Dado que las preguntas más generales se marcaron como duplicadas y se refieren a ellas aquí, este podría ser el mejor lugar para esta respuesta.
Julius Kunze
¡pathlib es mi biblioteca de acceso para el manejo de rutas ahora! No sabía nada de .home (). Tendré que volver a visitar los documentos para revisar todas las bondades. ¡Salud!
PlacidLush
5

home_folder = os.getenv('HOME')

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

Señor Zeus
fuente
1
al menos esto no funciona en win10 porque la variable tiene nombre HOMEPATH
Reishin
@Reishin eso no es del todo cierto, acabo de probarlo y funciona en Windows 10 Pro. Realmente no creo que puedan permitirse cambiar el nombre de una variable de entorno por capricho, dada la cantidad de software que espera encontrarla con ese nombre.
sm
@sm, intente encontrar aquí la variable "HOME" technet.microsoft.com/en-us/library/cc749104(v=ws.10).aspx . Si tiene una variable personalizada, eso no significa que todas las personas la tengan. En los más comunes, como mingw, cygwin, git shell, etc ... configurándolo por usted. Pero si ejecuta cmd.exe, se sorprendería
Reishin
4

Para ventanas;

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

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

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

le dará un identificador para el archivo de abajo;

C:\Users\urUserName\Documents\myfile.txt
Khawarizmi
fuente
3

Realmente, un cambio en la variable de entorno indica que se debe cambiar la vivienda. Entonces, cada programa / 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?

portador del anillo
fuente
5
Excepto en Cygwin, en cuyo caso ambos suelen estar definidos y muchas veces son diferentes.
amphetamachine
3

Me doy cuenta de que esta es una vieja pregunta que ha sido respondida, pero pensé que agregaría mis dos centavos. La respuesta aceptada no me funcionó. 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 usuarios 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 sudoen Mac y Linux.

Julien Spronck
fuente
Sé que dijo Mac y Linux, pero en Windows _USERNAMEera None. Para futuros lectores.
Thomas Fauskanger
de la ruta de importación de pathlib; Path.home (). As_posix () # también funciona en Windows. Esencialmente, al igual que el método de Spronck, podría ser más natural.
mikey
¿Sería una mejora hacerlo funcionar con Windows or ""?
PascalVKooten
0

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

Jakob Borg
fuente
1
Pero eso solo sería Unix (Linux) ¿no?
portador del anillo
1
@ring - sí. Texto agregado a tal efecto.
Jakob Borg
-1

obtener nombres de carpetas de usuario (traducidos) 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)
Axel Schneider
fuente
traducido como?
gerrit
Traducido al idioma del sistema operativo.
Axel Schneider