2010-04-19 6 views
51

Ich sehe, dass, wenn wir ändern die Umgebungsvariable HOME (Linux) oder USERPROFILE (Windows) und ein Python-Skript ausführen, gibt es den neuen Wert als Benutzer zu Hause, als ich versuchte, os.environ ['HOME'] os .expWie finde ich das echte Benutzer-Home-Verzeichnis mit Python?

Gibt es eine Möglichkeit, das echte Benutzerverzeichnis zu finden, ohne sich auf die Umgebungsvariable zu verlassen?

edit:
Hier ist ein Weg, userhome in Fenstern zu finden, indem in der Registrierung zu lesen,
http://mail.python.org/pipermail/python-win32/2008-January/006677.html

edit:
Eine Möglichkeit, Fenster zu Hause mit pywin32 zu finden,

from win32com.shell import shell,shellcon 
home = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0) 
+0

Vielleicht möchten Sie zur Kasse gehen Unix-Befehl (Verknüpfung): '~ Benutzer' Es bringt Sie zum Home-Verzeichnis des aktuellen Benutzers. Auf Windows habe keine Ahnung. –

Antwort

60

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

Auf Unix und Windows, senden Sie das Argument mit einer Anfangskomponente ~ oder ~user von diesem Benutzer Home-Verzeichnis ersetzt.

Unter Unix wird eine initiale ~ durch die Umgebungsvariable HOME ersetzt, wenn sie gesetzt ist; Andernfalls wird das Ausgangsverzeichnis des aktuellen Benutzers im Kennwortverzeichnis über das integrierte Modul pwd nachgeschlagen. Eine erste ~user wird direkt im Passwortverzeichnis nachgeschlagen.

Unter Windows werden HOME und USERPROFILE verwendet, wenn festgelegt, andernfalls wird eine Kombination von HOMEPATH und HOMEDRIVE verwendet. Eine erste ~user wird durch Entfernen der letzten Verzeichniskomponente aus dem erstellten Benutzerpfad, der über abgeleitet wurde, behandelt.

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

So könnten Sie einfach tun:

os.path.expanduser('~user') 
+2

Wahr, aber das Ändern der Umgebungsvariablen wie in der Frage wird diese Methode ebenfalls "täuschen". Nun, warum möchte ich das tun, kann ich nicht sagen. :) –

+1

@calmh: Ja, ich habe es geändert, um ''~ user'' zu verwenden, was unter Linux und Windows funktionieren sollte (hier bin ich nicht 100% sicher, da ich kein Windows zum Testen habe;)). –

+0

Dies funktioniert in Linux, aber nicht in Windows. In Windows verbindet es nur die "C: \ Dokumente und Einstellungen" mit dem übergebenen Benutzernamen. – asdfg

-1

Unter Linux und anderen UNIXoids können Sie immer einen Blick inwerfen. Das Home-Verzeichnis ist das sechste Doppelpunkt-getrennte Feld dort. Keine Ahnung, wie es besser geht als die Umgebungsvariable unter Windows. Es wird einen Systemaufruf dafür geben, aber wenn es von Python verfügbar ist, ...

+1

Aber das wäre nur Unix (Linux), oder? –

+1

@ring - ja. Zu diesem Zweck wurde ein Text hinzugefügt. –

1

Wirklich, eine Änderung in der Umgebungsvariablen zeigt an, dass das Heim geändert werden muss. Also sollte jedes Programm/Skript das neue Heim im Kontext haben; Auch die Konsequenzen liegen bei der Person, die sie verändert hat. würde ich immer noch mit home = os.getenv('USERPROFILE') or os.getenv('HOME')

was genau ist erforderlich?

+5

Außer auf Cygwin, in diesem Fall sind beide normalerweise definiert und oft anders. – amphetamachine

10

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 kann: das pwd Paket. z.B.

import os, pwd 

pwd.getpwuid(os.getuid()).pw_dir 
+1

Dies ist nützlich, wenn Sie das Ausgangsverzeichnis des Benutzers haben möchten, die HOME-Umgebungsvariable jedoch falsch eingestellt ist. Wie der Autor bemerkte, ist es nicht plattformunabhängig, sondern eher für UNIX, nicht für Windows. – user1071847

+1

Das ist besser, als sich auf die HOME-env-Variable zu verlassen, die bei sudo-Aufrufen nicht erhalten bleibt oder nicht. Zum Beispiel HOME env. Variable wird in Debian 8 auf den Benutzer des Ziels gesetzt ('sudo' fungiert als 'sudo -H'), wird aber in Ubuntu 16 beibehalten ('sudo' fungiert als 'sudo -E') –

5

home_folder = os.getenv('HOME')

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

+0

zumindest funktioniert das nicht auf win10 coz varible hat Name HOMEPATH – Reishin

+0

@Reishin das ist nicht ganz richtig, ich habe es gerade getestet und es funktioniert auf Windows 10 Pro. Ich glaube wirklich nicht, dass sie es sich leisten können, den Namen einer Umgebungsvariablen nach Belieben zu ändern, angesichts der Menge an Software, die erwartet, sie unter diesem Namen zu finden. –

+0

@ s.m. Bitte versuchen Sie es hier zu finden https://technet.microsoft.com/en-us/library/cc749104(v=ws.10).aspx "HOME" Variable. Wenn Sie eine benutzerdefinierte Variable haben, bedeutet das nicht, dass sie alle haben. In den meisten Fällen, wie Mingw, Cygwin, Git Shell, etc ... Einstellung für Sie. Aber wenn Sie cmd.exe ausführen, würden Sie überrascht sein – Reishin

2

Für Fenster;

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

geben Ihnen einen Griff in der aktuellen Home-Verzeichnis des Benutzers und

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

geben Ihnen einen Griff auf unter Datei;

C:\Users\urUserName\Documents\myfile.txt 
3
from pathlib import * 

str(Path.home()) 

Werke in Python 3.5 und höher. Path.home() gibt ein Path Objekt mit API zurück, das ich sehr nützlich finde.

+0

Intern, 'pathlib' basiert immer noch auf Umgebungsvariablen, so dass dies Ihre spezifische Frage nicht beantwortet. Da die allgemeineren Fragen alle als Duplikate gekennzeichnet waren und sich hierauf beziehen, könnte dies der beste Ort für diese Antwort sein. –

1

Ich weiß, dass dies eine alte Frage ist, die beantwortet wurde, aber ich dachte, ich würde meine zwei Cent hinzufügen. Die angenommene Antwort funktionierte nicht für mich. Ich musste das Benutzerverzeichnis finden und ich wollte es mit und ohne sudo arbeiten. In Linux ist mein Benutzerverzeichnis "/ home/someuser", aber mein Stammverzeichnis ist "/ root /". Auf meinem Mac ist das Benutzerverzeichnis jedoch "/ Users/someuser". Hier ist, was ich am Ende tun:

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

Das funktionierte sowohl mit als auch ohne sudo auf Mac und Linux.

+0

Dies ist die eigentliche richtige Antwort. – PascalVKooten

+0

Ich weiß, du hast Mac und Linux gesagt, aber auf Windows '' _USERNAME'' stand '' None''. Für zukünftige Leser. –

Verwandte Themen