¿Cuál es una forma multiplataforma de obtener el directorio de inicio?

4 minutos de lectura

avatar de usuario
nathan osman

Necesito obtener la ubicación del directorio de inicio del usuario que ha iniciado sesión actualmente. Actualmente, he estado usando lo siguiente en Linux:

os.getenv("HOME")

Sin embargo, esto no funciona en Windows. ¿Cuál es la forma multiplataforma correcta de hacer esto?

  • Esto está marcado como un duplicado de Cómo encontrar el directorio de inicio del usuario real usando python, pero voté para reabrir porque esta respuesta funciona en Python 3 y la respuesta anterior no.

    – Arco Alto Dour

    17 jun 2020 a las 18:40

  • tu puedes hacer from pathlib import Path; home: str = str(Path('~').expanduser())

    –Charlie Parker

    29 de julio a las 16:21

avatar de usuario
elegante

quieres usar os.path.expanduser.
Esto asegurará que funcione en todas las plataformas:

from os.path import expanduser
home = expanduser("~")

si estás en Pitón 3.5+ puedes usar pathlib.Ruta.inicio():

from pathlib import Path
home = str(Path.home())

  • Cabe señalar que si el usuario inició sesión en un dominio en Windows y tiene la carpeta de inicio de su perfil configurada en el directorio activo, esto informará esa carpeta de red asignada en lugar del directorio de inicio local.

    – escapar

    17 de diciembre de 2012 a las 19:18

  • Si alguien solo quiere el directorio de inicio en lugar del directorio de usuario, puede intentar encontrar el directorio de usuario (ud) y haciendo esto: hd=os.sep.join(ud.split(os.sep)[:-1])

    – Brotsyorfuzthrāx

    28 de octubre de 2016 a las 9:26

  • Me pregunto por qué nadie más lo mencionó en esta pregunta, pero si necesita saber dónde está el directorio de inicio de otro usuario, puede usar os.path.expanduser('~username'). Sin embargo, probablemente solo se aplique a Linux.

    – Máx.

    28 de junio de 2018 a las 11:56


  • @Dipayan no, ese es el backport de Python 2 de pathlib. Para Python 3, pathlib es correcto.

    – Alpaca

    16 de julio de 2019 a las 18:08

  • El resultado es el mismo. Si generalmente trabaja con pathlib, puede preferir la solución pathlib (y omitir la llamada de str). Si solo quiere la ruta como cadena, ambos hacen lo mismo.

    – Niklas Mertsch

    15 de agosto de 2019 a las 12:31

Descubrí que el módulo pathlib también es compatible con esto.

from pathlib import Path
>>> Path.home()
WindowsPath('C:/Users/XXX')

Sé que este es un hilo antiguo, pero recientemente lo necesitaba para un proyecto a gran escala (Python 3.8). Tenía que funcionar en cualquier sistema operativo principal, por lo que opté por la solución que escribió @Max en los comentarios.

Código:

import os
print(os.path.expanduser("~"))

Ventanas de salida:

PS C:\Python> & C:/Python38/python.exe c:/Python/test.py
C:\Users\mXXXXX

Salida Linux (Ubuntu):

[email protected]:/mnt/c/Python$ python3 test.py
/home/rxxx

También lo probé en Python 2.7.17 y también funciona.

  • ¿En qué se diferencia tu respuesta de la de dcolish?

    – El Padrino

    22 de abril de 2021 a las 17:28

Esto se puede hacer usando pathlibque forma parte de la biblioteca estándar y trata las rutas como objetos con métodos, en lugar de cadenas.

from pathlib import Path

home: str = str(Path('~').expanduser())

Esto realmente no califica para la pregunta (está etiquetado como cross-platform), pero tal vez esto podría ser útil para alguien.

Cómo obtener el directorio de inicio para eficaz usuario (Específico de Linux).

Imaginemos que está escribiendo un script de instalación o alguna otra solución que requiere que realice ciertas acciones bajo ciertos usuarios locales. Lo más probable es que logre esto en su secuencia de comandos de instalación cambiando el usuario efectivo, pero os.path.expanduser("~") todavía volverá /root.

El argumento debe tener el nombre de usuario deseado:

os.path.expanduser(f"~{USERNAME}/")

Tenga en cuenta que lo anterior funciona bien sin cambiar el EUID, pero si se aplicara el escenario descrito anteriormente, el siguiente ejemplo muestra cómo se podría usar:

import os
import pwd
import grp

class Identity():

    def __init__(self, user: str, group: str = None):
        self.uid = pwd.getpwnam(user).pw_uid
        if not group:
            self.gid = pwd.getpwnam(user).pw_gid
        else:
            self.gid = grp.getgrnam(group).gr_gid

    def __enter__(self):
        self.original_uid = os.getuid()
        self.original_gid = os.getgid()
        os.setegid(self.uid)
        os.seteuid(self.gid)

    def __exit__(self, type, value, traceback):
        os.seteuid(self.original_uid)
        os.setegid(self.original_gid)

if __name__ == '__main__':

    with Identity("hedy", "lamarr"):
        homedir = os.path.expanduser(f"~{pwd.getpwuid(os.geteuid())[0]}/")
        with open(os.path.join(homedir, "install.log"), "w") as file:
            file.write("Your home directory contents have been altered")

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad