761 Stimmen

Gibt es einen tragbaren Weg, um den aktuellen Benutzernamen in Python zu erhalten?

Was ist ein plattformübergreifender Weg (z. B. für Linux und Windows), um den Benutzernamen des aktuellen Benutzers zu erhalten? Etwas ähnliches wie os.getuid() wäre schön:

>>> os.getuid()
42

# Existiert derzeit nicht in Python
>>> os.getusername()
'slartibartfast'

Das pwd Modul funktioniert nur für Unix. Einige Leute meinen, dass das Abrufen des Benutzernamens unter Windows in bestimmten Situationen kompliziert sein kann (z. B. bei der Ausführung als Windows-Dienst).

0 Stimmen

Es funktioniert nicht auf meinem Linux-Rechner!

6 Stimmen

import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecos oder import pwd, os; print pwd.getpwuid(os.getuid()).pw_name

0 Stimmen

Getusername() ist keine gültige Methode im os Python-Modul: docs.python.org/2.7/library/os.html

24voto

HezniK Punkte 245

Wenn Sie dies benötigen, um das Benutzerverzeichnis zu erhalten, könnte das folgende als portabel betrachtet werden (zumindest win32 und Linux), Teil einer Standardbibliothek.

>>> os.path.expanduser('~')
'C:\\Documents and Settings\\johnsmith'

Sie könnten auch einen solchen String analysieren, um nur das letzte Pfadsegment zu erhalten (d.h. den Benutzernamen).

Siehe: os.path.expanduser

12 Stimmen

Das Home-Verzeichnis einer Person entspricht nicht immer ihrem Benutzernamen.

0 Stimmen

Leider wird, wenn Sie die HOME-Variable in Windows setzen, dieser Wert zurückgegeben.

19voto

Erik Aronesty Punkte 9973

psutil bietet eine portable Möglichkeit, die keine Umgebungsvariablen wie die getpass-Lösung verwendet. Es ist weniger anfällig für Sicherheitsprobleme und sollte wahrscheinlich die akzeptierte Antwort ab heute sein.

import psutil

def get_username():
    return psutil.Process().username()

Unter der Haube kombiniert dies die auf getpwuid basierende Methode für Unix und die auf GetTokenInformation basierende Methode für Windows.

0 Stimmen

Gibt es eine Funktion, um es ohne die Domäne zu erhalten, oder soll ich es am / aufteilen?

0 Stimmen

Aufteilen bei "\\" falls vorhanden, siehe: github.com/giampaolo/psutil/issues/1049

17voto

Für mich sieht die Verwendung des os-Moduls am besten für die Portabilität aus: Funktioniert sowohl auf Linux als auch auf Windows.

import os

# Gibt das Benutzerverzeichnis zurück
userhome = os.path.expanduser('~')          

print "Benutzerverzeichnis: " + userhome

# Gibt den Benutzernamen durch Aufteilen des Pfades basierend auf dem Betriebssystem zurück
print "Benutzername: " + os.path.split(userhome)[-1]           

Ausgabe:

Windows:

Benutzerverzeichnis: C:\Benutzer\meinbenutzer

Benutzername: meinbenutzer

Linux:

Benutzerverzeichnis: /root

Benutzername: root

Es ist keine Installation von Modulen oder Erweiterungen erforderlich.

26 Stimmen

Diese Lösung ist clever, macht jedoch einige Annahmen, die nicht immer zutreffen. Es gibt keine Einschränkung, die erfordert, dass der Benutzername im homedir-Pfad unter Linux erscheint. Dies geschieht nur meistens, aber ein Sysadmin kann das homedir eines Benutzers auf das einstellen, was sie wollen.

1 Stimmen

Das Festlegen der HOME-Variable setzt dies außer Kraft.

15voto

anatoly techtonik Punkte 18578

Kombinierter Ansatz für pwd und getpass, basierend auf anderen Antworten:

try:
  import pwd
except ImportError:
  import getpass
  pwd = None

def aktueller_benutzer():
  if pwd:
    return pwd.getpwuid(os.geteuid()).pw_name
  else:
    return getpass.getuser()

0 Stimmen

getpass.getuser() Ruft einen nicht leeren String von den Umgebungsvariablen LOGNAME, USER, LNAME und USERNAME ab, in dieser Reihenfolge. Wenn keine davon festgelegt sind, wird der Anmeldename aus der Passwortdatenbank zurückgegeben, auf Systemen, die das pwd-Modul unterstützen, andernfalls wird eine Ausnahme ausgelöst. pw_name ist auch der Anmeldename

0 Stimmen

Ich könnte nur die pwd Seite verwenden, aber dies ist die einzige Antwort hier, die den Namen der wirklichen Benutzer-ID erhält.

7voto

dylnmc Punkte 3560

Für UNIX-Systeme funktioniert zumindest dies...

import commands
username = commands.getoutput("echo $(whoami)")
print username

Bearbeiten: Ich habe gerade nachgeschaut und dies funktioniert auf Windows und UNIX:

import commands
username = commands.getoutput("whoami")

Auf UNIX gibt es deinen Benutzernamen zurück, aber auf Windows gibt es deine Benutzergruppe zurück, Schrägstrich, deinen Benutzernamen.

--

Zum Beispiel:

UNIX gibt zurück: "Benutzername"

Windows gibt zurück: "Domäne/Benutzername"

--

Es ist interessant, aber wahrscheinlich nicht ideal, es sei denn, du machst sowieso etwas im Terminal... in welchem Fall du wahrscheinlich ohnehin os.system verwenden würdest. Zum Beispiel musste ich vor einer Weile meinen Benutzer zu einer Gruppe hinzufügen, also habe ich dies gemacht (das ist in Linux, beachte)

import os
os.system("sudo usermod -aG \"Gruppenname\" $(whoami)")
print "Du wurdest zu \"Gruppenname\" hinzugefügt! Bitte melde dich ab, damit dies in Kraft tritt"

Ich denke, das ist einfacher zu lesen und du musst pwd oder getpass nicht importieren.

Ich denke auch, dass "Domäne/Benutzer" in bestimmten Anwendungen in Windows hilfreich sein könnte.

2 Stimmen

WIndows gibt domain/user zurück, nicht group/user

4 Stimmen

Das Befehle-Modul funktioniert nicht unter Windows. Es handelt sich um ein UNIX-spezifisches Modul (siehe docs.python.org/2/library/commands.html). Es ist jetzt veraltet und stattdessen wird die Verwendung von Subprozessen empfohlen. user = subprocess.check_output("whoami").replace("\r\n", "")

0 Stimmen

2 Anmerkungen. commands.whoami hat gute Arbeit geleistet, selbst im Kontext eines Dienstes, der unter einem anderen Benutzernamen läuft. d.h. mit chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid habe ich nobody erhalten. Zweitens ist user = subprocess.check_output("whoami").strip() portabler als die vorherigen Zeilen. commands vs subprocess scheint kleinlich zu sein, aber commands fehlt in Python 3.

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