Ich sehe, wenn wir die Umgebungsvariable HOME (linux) oder USERPROFILE (windows) ändern und ein Python-Skript ausführen, wird der neue Wert als Benutzer home zurückgegeben, als ich es versucht habe Os.environ ['HOME'] os.exp
Gibt es eine Möglichkeit, das echte Benutzerverzeichnis zu finden, ohne sich auf die Umgebungsvariable zu verlassen?
edit:
Hier finden Sie eine Möglichkeit, den Benutzer in Windows durch Lesen in der Registrierung zu finden.
http://mail.python.org/pipermail/python-win32/2008-January/006677.html
edit:
Eine Möglichkeit, Windows mit pywin32 zu finden,
from win32com.Shell import Shell,shellcon
home = Shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0)
Ich denke, os.path.expanduser(path)
könnte hilfreich sein.
Geben Sie unter Unix und Windows das Argument mit einer Anfangskomponente von
~
oder~user
zurück, die durch das Basisverzeichnis dieses Benutzers ersetzt wird.Unter Unix wird ein anfänglicher
~
durch die Umgebungsvariable HOME ersetzt, wenn diese gesetzt ist. Andernfalls wird das Heimatverzeichnis des aktuellen Benutzers im Kennwortverzeichnis durch das integrierte Modulpwd
gesucht. Ein erster~user
wird direkt im Kennwortverzeichnis nachgeschlagen.Unter Windows werden HOME und USERPROFILE verwendet, falls gesetzt, andernfalls wird eine Kombination aus HOMEPATH und HOMEDRIVE verwendet. Ein anfänglicher
~user
wird behandelt, indem die letzte Verzeichniskomponente aus dem erstellten Benutzerpfad entfernt wird, der über abgeleitet wurde.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 folgendes tun:
os.path.expanduser('~user')
Ich denke, os.path.expanduser(path)
ist die beste Antwort auf Ihre Frage, aber es gibt eine Alternative, die in der Unix-Welt erwähnenswert sein sollte: das Paket pwd
. z.B.
import os, pwd
pwd.getpwuid(os.getuid()).pw_dir
from pathlib import *
str(Path.home())
arbeitet in Python 3.5 und höher. Path.home()
gibt ein Path
-Objekt zurück, das eine API bereitstellt, die ich sehr nützlich finde.
home_folder = os.getenv('HOME')
Dies sollte auch unter Windows und Mac OS funktionieren, funktioniert auch unter Linux.
Für Windows;
import os
homepath = os.path.expanduser(os.getenv('USERPROFILE'))
gibt Ihnen ein Handle für das Home-Verzeichnis des aktuellen Benutzers und
filepath = os.path.expanduser(os.getenv('USERPROFILE'))+'\\Documents\\myfile.txt'
gibt Ihnen einen Griff zur unteren Datei;
C:\Users\urUserName\Documents\myfile.txt
Ich weiß, dass dies eine alte Frage ist, die beantwortet wurde, aber ich dachte, ich würde meine zwei Cents hinzufügen. Die akzeptierte Antwort funktionierte nicht für mich. Ich musste das Benutzerverzeichnis finden und wollte, dass es mit und ohne Sudo
funktioniert. In Linux lautet mein Benutzerverzeichnis "/ home/someuser", mein Stammverzeichnis ist jedoch "/ root /". Auf meinem Mac lautet das Benutzerverzeichnis jedoch "/ Users/someuser". Folgendes habe ich am Ende getan:
_USERNAME = os.getenv("Sudo_USER") or os.getenv("USER")
_HOME = os.path.expanduser('~'+_USERNAME)
Dies funktionierte sowohl mit als auch ohne Sudo
unter Mac und Linux.
Eine Änderung der Umgebungsvariablen zeigt tatsächlich an, dass das Heim geändert werden muss. Daher sollte jedes Programm/Skript die neue Heimat im Kontext haben. Die Konsequenzen liegen auch bei der Person, die sie geändert hat. Ich würde noch bei home = os.getenv('USERPROFILE') or os.getenv('HOME')
bleiben
was ist genau erforderlich?
benutzerordnernamen unter Linux übersetzen:
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)
Unter Linux und anderen UNIXoids können Sie immer einen Blick in /etc/passwd
werfen. Das Ausgangsverzeichnis 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, ...