wake-up-neo.com

Gibt es eine tragbare Möglichkeit, den aktuellen Benutzernamen in Python abzurufen?

Gibt es eine tragbare Möglichkeit, den Benutzernamen des aktuellen Benutzers in Python abzurufen (d. H. Eine, die mindestens unter Linux und Windows funktioniert). Es würde wie os.getuid funktionieren:

>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'

Ich googelte herum und war überrascht, keine endgültige Antwort zu finden (obwohl ich vielleicht nur schlecht googelte). Das pwd -Modul bietet eine relativ einfache Möglichkeit, dies beispielsweise unter Linux zu erreichen, ist jedoch unter Windows nicht vorhanden. Einige der Suchergebnisse deuteten darauf hin, dass das Abrufen des Benutzernamens unter Windows unter bestimmten Umständen kompliziert sein kann (z. B. als Windows-Dienst ausgeführt), obwohl ich dies nicht überprüft habe.

557

Schauen Sie sich das getpass Modul an

import getpass
getpass.getuser()
'kostya'

Verfügbarkeit: Unix, Windows


p.s. Per Kommentar unter " untersucht diese Funktion die Werte verschiedener Umgebungsvariablen, um den Benutzernamen zu bestimmen. Daher sollte diese Funktion nicht für Zugriffskontrollzwecke (oder möglicherweise für einen anderen Zweck) herangezogen werden, da es erlaubt jedem Benutzer, sich als jeder andere auszugeben. "

761

Am besten kombinieren Sie os.getuid() mit pwd.getpwuid():

import os
import pwd

def get_username():
    return pwd.getpwuid( os.getuid() )[ 0 ]

Weitere Informationen finden Sie in den pwd-Dokumenten:

http://docs.python.org/library/pwd.html

99
Liam Chasteen

Sie können auch verwenden:

 os.getlogin()
77

Sie können wahrscheinlich verwenden:

os.environ.get('USERNAME')

oder

os.environ.get('USER')

Es ist jedoch nicht sicher, da Umgebungsvariablen geändert werden können.

61
Nadia Alramli

Dies könnte funktionieren. Ich weiß nicht, wie sie sich verhalten, wenn sie als Dienst ausgeführt werden. Sie sind nicht portierbar, aber dafür sind os.name und ifAnweisungen gedacht.

win32api.GetUserName()

win32api.GetUserNameEx(...) 

Siehe: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html

20
Adam

Wenn Sie dies benötigen, um das Home-Verzeichnis des Benutzers abzurufen, kann das folgende als portabel (mindestens Win32 und Linux) betrachtet werden, als Teil einer Standardbibliothek.

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

Sie können diese Zeichenfolge auch analysieren, um nur die letzte Pfadkomponente (dh den Benutzernamen) abzurufen.

Siehe: os.path.expanduser

18
HezniK

Für mich sieht die Verwendung des Moduls os für die Portabilität am besten aus: Funktioniert am besten unter Linux und Windows.

import os

# Gives user's home directory
userhome = os.path.expanduser('~')          

print "User's home Dir: " + userhome

# Gives username by splitting path based on OS
print "username: " + os.path.split(userhome)[-1]           

Ausgabe:

Windows:

Ausgangsverzeichnis des Benutzers: C:\Users\myuser

benutzername: myuser

Linux:

Home-Verzeichnis des Benutzers:/root

benutzername: root

Es müssen keine Module oder Erweiterungen installiert werden.

15
user966588

Kombinierter pwd und getpass Ansatz, basierend auf anderen Antworten:

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

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

Zumindest unter UNIX funktioniert dies ...

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

edit: Ich habe es gerade nachgeschlagen und es funktioniert unter Windows und UNIX:

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

Unter UNIX gibt es Ihren Benutzernamen zurück, unter Windows jedoch die Benutzergruppe, den Schrägstrich und Ihren Benutzernamen.

-

I.E.

UNIX gibt zurück: "Benutzername"

Windows gibt zurück: "Domain/Benutzername"

-

Es ist interessant, aber wahrscheinlich nicht ideal, es sei denn, Sie tun sowieso etwas im Terminal. In diesem Fall würden Sie wahrscheinlich zunächst os.system verwenden. Vor einiger Zeit musste ich beispielsweise meinen Benutzer zu einer Gruppe hinzufügen, was ich auch getan habe (das ist wohlgemerkt unter Linux).

import os
os.system("Sudo usermod -aG \"group_name\" $(whoami)")
print "You have been added to \"group_name\"! Please log out for this to take effect"

Ich denke, das ist einfacher zu lesen nd Sie müssen weder pwd noch getpass importieren.

Ich habe auch das Gefühl, dass "Domäne/Benutzer" in bestimmten Windows-Anwendungen hilfreich sein könnte.

8
dylnmc

Ich habe vor einiger Zeit das plx-Modul geschrieben, um den Benutzernamen unter Unix und Windows (unter anderem) portabel abzurufen: http://www.decalage.info/en/python/plx

Verwendungszweck:

import plx

username = plx.get_username()

(Es erfordert Win32-Erweiterungen unter Windows)

5
decalage

Sie können den aktuellen Benutzernamen unter Windows über die Windows-API abrufen, obwohl das Aufrufen über die C-Typen FFI ( GetCurrentProcessOpenProcessTokenGetTokenInformation) etwas umständlich istLookupAccountSid ).

Ich habe ein kleines Modul geschrieben, das dies direkt von Python aus tun kann, getuser.py . Verwendungszweck:

import getuser
print(getuser.lookup_username())

Es funktioniert sowohl unter Windows als auch unter * nix (letzteres verwendet das pwd -Modul, wie in den anderen Antworten beschrieben).

3
Michael Kropat

Verwenden Sie nur die Standard-python -Libs:

from os import environ,getcwd
getUser = lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"]
user = getUser()

Funktioniert unter Windows oder Linux

Alternativ können Sie eine Zeile mit einem sofortigen Aufruf entfernen:

from os import environ,getcwd
user = (lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"])()
0
ThisGuyCantEven