Wie finde ich das echte Benutzer-Home-Verzeichnis mit Python?

81

Ich sehe, dass, wenn wir die Umgebungsvariable HOME (Linux) oder USERPROFILE (Windows) ändern und ein Python-Skript ausführen, der neue Wert als Benutzer-Home zurückgegeben wird, als ich es versuchte, os.environ ['HOME'] os.exp

Gibt es eine Möglichkeit, das Home-Verzeichnis des realen Benutzers zu finden, ohne sich auf die Umgebungsvariable zu verlassen?

Bearbeiten:
Hier finden Sie eine Möglichkeit, das Benutzerhaus in Windows zu finden, indem Sie in der Registrierung http://mail.python.org/pipermail/python-win32/2008-January/006677.html lesen

Bearbeiten:
Eine Möglichkeit, Windows Home mit pywin32 zu finden,

from win32com.shell import shell,shellcon
home = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0)
asdfg
quelle
Möglicherweise möchten Sie den Unix-Befehl (Verknüpfung) auschecken: ~userEr führt Sie zum Ausgangsverzeichnis des aktuellen Benutzers. Auf Windows habe ich keine Ahnung.
mAm
Dies sollte als Duplikat von Wie bekomme ich das Home-Verzeichnis in Python? da die akzeptierte Antwort dieser Frage unter Python 3 funktioniert und diese Frage nicht.
Dour High Arch

Antworten:

96

Ich denke os.path.expanduser(path)könnte hilfreich sein.

Geben Sie unter Unix und Windows das Argument mit einer Anfangskomponente des Basisverzeichnisses dieses Benutzers zurück ~ oder ~userersetzen Sie es durch dieses.

Unter Unix wird eine Initiale ~durch die Umgebungsvariable HOME ersetzt, wenn sie festgelegt ist. Andernfalls wird das Home-Verzeichnis des aktuellen Benutzers über das integrierte Modul im Kennwortverzeichnis nachgeschlagen pwd. Eine Initiale ~userwird direkt im Passwortverzeichnis nachgeschlagen .

Unter Windows werden HOME und USERPROFILE verwendet, wenn diese Option aktiviert ist. Andernfalls wird eine Kombination aus HOMEPATH und HOMEDRIVE verwendet. Eine Initiale ~userwird behandelt, indem die letzte Verzeichniskomponente aus dem oben abgeleiteten erstellten Benutzerpfad entfernt wird .

Wenn die Erweiterung fehlschlägt oder der Pfad nicht mit einer Tilde beginnt, wird der Pfad unverändert zurückgegeben.

Sie könnten also einfach tun:

os.path.expanduser('~user')
Felix Kling
quelle
3
Richtig, aber das Ändern der Umgebungsvariablen wie in der Frage wird diese Methode ebenfalls "täuschen". Warum man das machen möchte, kann ich nicht sagen. :)
Jakob Borg
1
@calmh: Ja, ich habe es so geändert, dass es unter '~user'Linux und Windows funktioniert (hier bin ich mir nicht 100% sicher, weil ich kein Windows zum Testen habe;)).
Felix Kling
1
Dies funktioniert unter Linux, aber nicht unter Windows. In Windows verbindet es einfach das "C: \ Dokumente und Einstellungen" mit dem übergebenen Benutzernamen.
Asdfg
Dies löst nicht das Problem, dass die Variable "HOME" falsch ist. Siehe cadence.com/Community/forums/t/17969.aspx zum Beispiel
Endolith
1
@asdfg: Es klingt für mich so, als ob es richtig funktioniert hat. Aber ich dachte auch, dass es beim ersten Versuch fehlgeschlagen war, weil ich zuerst die Literalzeichenfolge '~ user' (die wirklich etwas Literales wie '~ Bob' sein muss) anstelle von nur '~' (die anhängt) übergeben habe der aktuelle Benutzer).
Jon Coombs
17

Ich denke, es os.path.expanduser(path)ist die beste Antwort auf Ihre Frage, aber es gibt eine Alternative, die in der Unix-Welt erwähnenswert sein könnte: das pwdPaket. z.B

import os, pwd

pwd.getpwuid(os.getuid()).pw_dir
Brian M. Hunt
quelle
1
Dies ist nützlich, wenn Sie das Home-Verzeichnis des Benutzers möchten, die Umgebungsvariable HOME jedoch falsch festgelegt ist. Wie der Autor feststellte, ist es nicht plattformunabhängig, sondern für UNIX, nicht für Windows.
user1071847
1
Dies ist besser, als sich auf die Variable HOME env zu verlassen, die bei sudo-Aufrufen möglicherweise beibehalten wird oder nicht. Zum Beispiel HOME env. Die Variable wird in Debian 8 auf den Benutzer des Ziels gesetzt ('sudo' fungiert als 'sudo -H'), bleibt jedoch in Ubuntu 16 erhalten ('sudo' fungiert als 'sudo -E')
Andrei Korostelev
16
from pathlib import *

str(Path.home())

funktioniert in Python 3.5 und höher. Path.home()gibt ein PathObjekt zurück, das eine API bereitstellt, die ich sehr nützlich finde.

Julius Kunze
quelle
1
Intern sind pathlibimmer noch Umgebungsvariablen erforderlich, sodass Ihre spezifische Frage nicht beantwortet wird. Da die allgemeineren Fragen alle als Duplikate markiert waren und sich hier beziehen, ist dies möglicherweise der beste Ort für diese Antwort.
Julius Kunze
pathlib ist jetzt meine Bibliothek für die Pfadbehandlung! Ich wusste nichts über .home (). Ich muss die Dokumente noch einmal besuchen, um die ganze Güte zu überprüfen. Prost!
PlacidLush
5

home_folder = os.getenv('HOME')

Dies sollte auch unter Windows und Mac OS funktionieren, funktioniert gut unter Linux.

Herr Zeus
quelle
1
Zumindest funktioniert dies nicht auf win10 coz varible hat den Namen HOMEPATH
Reishin
@Reishin das ist nicht ganz richtig, ich habe es gerade getestet und es funktioniert unter Windows 10 Pro. Ich glaube wirklich nicht, dass sie es sich leisten können, den Namen einer Umgebungsvariablen aus einer Laune heraus zu ändern, angesichts der Menge an Software, die erwartet, sie unter diesem Namen zu finden.
sm
@sm Bitte versuchen Sie hier die Variable technet.microsoft.com/en-us/library/cc749104(v=ws.10).aspx "HOME" zu finden. Wenn Sie eine benutzerdefinierte Variable haben, bedeutet dies nicht, dass alle Personen diese haben. In den meisten Fällen, wie z. B. Mingw, Cygwin, Git Shell usw., wird es für Sie eingestellt. Aber wenn Sie cmd.exe ausführen, wären Sie überrascht
Reishin
4

Für Windows;

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

gibt Ihnen ein Handle zum Home-Verzeichnis des aktuellen Benutzers und

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

gibt Ihnen ein Handle für die folgende Datei;

C:\Users\urUserName\Documents\myfile.txt
khawarizmi
quelle
3

In der Tat zeigt eine Änderung der Umgebungsvariablen an, dass das Haus geändert werden muss. Daher sollte jedes Programm / Skript das neue Zuhause im Kontext haben. Auch die Konsequenzen liegen bei der Person, die sie geändert hat. Ich würde immer noch dabei bleiben home = os.getenv('USERPROFILE') or os.getenv('HOME')

was genau ist erforderlich?

Ringträger
quelle
5
Außer bei Cygwin, in diesem Fall sind beide normalerweise definiert und oft unterschiedlich.
Amphetamachine
3

Mir ist klar, dass dies eine alte Frage ist, die beantwortet wurde, aber ich dachte, ich würde meine zwei Cent hinzufügen. Die akzeptierte Antwort funktionierte bei mir nicht. Ich musste das Benutzerverzeichnis finden und wollte, dass es mit und ohne funktioniert sudo. Unter Linux lautet mein Benutzerverzeichnis "/ home / someuser", mein Stammverzeichnis jedoch "/ root /". Auf meinem Mac lautet das Benutzerverzeichnis jedoch "/ Users / someuser". Folgendes habe ich getan:

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

Dies funktionierte sowohl mit als auch ohne sudoauf Mac und Linux.

Julien Spronck
quelle
Ich weiß, dass Sie Mac und Linux gesagt haben, aber unter Windows _USERNAMEwar None. Für zukünftige Leser.
Thomas Fauskanger
von pathlib import Path; Path.home (). As_posix () # funktioniert auch unter Windows. Im Wesentlichen die gleiche Methode wie Spronck, könnte sie natürlicher sein.
Mikey
Wäre es eine Verbesserung, damit es mit Windows funktioniert, ist es hinzuzufügen or ""?
PascalVKooten
0

Unter Linux und anderen UNIXoids können Sie jederzeit einen Blick darauf werfen /etc/passwd. Das Home-Verzeichnis ist das sechste durch Doppelpunkte getrennte Feld. Keine Ahnung, wie man es besser macht als die Umgebungsvariable unter Windows. Es wird einen Systemaufruf dafür geben, aber wenn es von Python verfügbar ist, ...

Jakob Borg
quelle
1
Aber das wäre doch nur Unix (Linux), oder?
Ringträger
1
@ring - yep. Text zu diesem Effekt hinzugefügt.
Jakob Borg
-1

Abrufen von (übersetzten) Benutzerordnernamen unter 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
quelle
übersetzt wie?
Gerrit
In die Betriebssystemsprache übersetzt.
Axel Schneider