1228 Stimmen

Was ist der richtige plattformübergreifende Weg, um das Home-Verzeichnis in Python zu erhalten?

Ich muss den Speicherort des Home-Verzeichnisses des aktuell angemeldeten Benutzers ermitteln. Derzeit verwende ich unter Linux Folgendes:

os.getenv("HOME")

Dies funktioniert jedoch nicht unter Windows. Was ist der richtige plattformübergreifende Weg, dies zu tun?

2119voto

dcolish Punkte 21107

Sie möchten Folgendes verwenden os.path.expanduser .
So wird sichergestellt, dass sie auf allen Plattformen funktioniert:

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

Wenn Sie auf Python 3.5+ können Sie pathlib.Path.home() :

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

37voto

Jaeyoon Jeong Punkte 419

Ich habe festgestellt, dass das Modul pathlib dies ebenfalls unterstützt.

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

23voto

user56700 Punkte 1207

Ich weiß, dies ist ein alter Thread, aber ich brauchte dies vor kurzem für ein großes Projekt (Python 3.8). Es musste auf jedem Mainstream-Betriebssystem funktionieren, daher habe ich mich für die Lösung entschieden, die @Max in den Kommentaren geschrieben hat.

Code:

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

Ausgabefenster:

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

Ausgabe Linux (Ubuntu):

rxxx@xx:/mnt/c/Python$ python3 test.py
/home/rxxx

Ich habe es auch mit Python 2.7.17 getestet und das funktioniert auch.

-2voto

Tammi Punkte 386

Dies ist nicht wirklich für die Frage qualifiziert (da es als cross-platform ), aber vielleicht kann dies für jemanden nützlich sein.

So erhalten Sie das Home-Verzeichnis für wirksam Benutzer (Linux-spezifisch) .

Stellen Sie sich vor, Sie schreiben ein Installationsskript oder eine andere Lösung, bei der Sie bestimmte Aktionen unter bestimmten lokalen Benutzern durchführen müssen. Wahrscheinlich würden Sie dies in Ihrem Installationsskript erreichen, indem Sie den effektiven Benutzer ändern, aber os.path.expanduser("~") wird dennoch zurückkehren /root .

Das Argument muss den gewünschten Benutzernamen enthalten:

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

Beachten Sie, dass die obige Vorgehensweise auch ohne Änderung der EUID funktioniert, aber wenn das zuvor beschriebene Szenario zutrifft, zeigt das folgende Beispiel, wie dies verwendet werden könnte:

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")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X