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

7voto

ThisGuyCantEven Punkte 864

Verwenden Sie nur standardmäßige Python-Bibliotheken:

from os import environ
from sys import platform

def getUser():
    return environ["USERNAME"] if platform.startswith("win") else environ["USER"]

user = getUser()

Funktioniert auf Windows, Mac oder Linux.

2 Stimmen

Getpass ist ebenfalls eine Standardbibliothek

0 Stimmen

Funktioniert für mich nicht in Win10, Python3.7.4. Es beschwert sich darüber, dass 'USER' nicht in den Umgebungsvariablen gefunden wird, denke ich. Wahrscheinlich ist getpass sowieso eine bessere Wahl.

0 Stimmen

Das einzige, was dies verursachen würde, ist, wenn Sie es von einem Laufwerk ausführen, das nicht C: ist. Das ist der einzige Grund, warum es den USER-Schlüssel verwendet und nicht USERNAME. Dies ist buchstäblich nur ein if/else... Alles was es tut, ist USERNAME zu verwenden, wenn es ein C:-Laufwerk gibt, sonst USER.

5voto

Dmitry T. Punkte 434

Keine der oben genannten Lösungen hat in meinem Fall funktioniert (scrollen Sie nach unten zur eigentlichen Lösung).
Das Problem, das ich bei allen Lösungen habe, ist der falsche Benutzername beim Ausführen von Befehlen mit sudo:

  • psutil Lösung:

    $ python3

    import psutil psutil.Process().username() 'ubuntu' # OK!

    $ sudo su $ python3

    import psutil psutil.Process().username() 'root' # OK!

    $ sudo python3

    import psutil psutil.Process().username() 'root' # FALSCH, sollte ubuntu sein!

  • getpass Lösung:

    $ python3

    import getpass getpass.getuser() 'ubuntu' # OK!

    $ sudo su $ python3

    import getpass getpass.getuser() 'root' # OK!

    $ sudo python3

    import getpass getpass.getuser() 'root' # FALSCH, sollte ubuntu sein!

  • pwd + os.getuid Lösung:

    $ python3

    import os, pwd pwd.getpwuid( os.getuid() )[ 0 ] 'ubuntu' # OK!

    $ sudo su $ python3

    import os, pwd pwd.getpwuid( os.getuid() )[ 0 ] 'root' # OK!

    $ sudo python3

    import getpass getpass.getuser() 'root' # FALSCH, sollte ubuntu sein!

  • os.getlogin funktioniert etwas anders, aber immer noch falsch:

    $ python3

    import os os.getlogin() 'ubuntu' # OK!

    $ sudo su $ python3

    import os os.getlogin() 'ubuntu' # FALSCH, sollte root sein!

    $ sudo python3

    import os os.getlogin() 'ubuntu' # OK!

  • os.getenv liefert die gleichen Ergebnisse:

    $ python3

    import os os.getenv('SUDO_USER', os.getenv('USER')) 'ubuntu' # OK!

    $ sudo su $ python3

    import os os.getenv('SUDO_USER', os.getenv('USER')) 'ubuntu' # FALSCH, sollte root sein!

    $ sudo python3

    import os os.getenv('SUDO_USER', os.getenv('USER')) 'ubuntu' # OK!

Das Umschalten von SUDO_USER und USER liefert im Fall von sudo python3 das falsche Ergebnis.

Eigentliche Lösung (nicht portabel)

Die Lösung ist etwas knifflig und basiert auf dem Standard-Home-Verzeichnis von root, funktioniert aber in allen Fällen:

$ python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!

$ sudo su
$ python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'root' #  OK!

$ sudo python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!

1 Stimmen

Dies ist die Antwort auf eine sehr unterschiedliche Frage

1 Stimmen

Aber dafür dankbar - befasst sich mit dem sudo Problem für eine ganz andere Frage für diejenigen, die nach der Antwort darauf suchen, kommen über eine Google-Suche hierher. Vielleicht nur eine etwas andere Frage.

1 Stimmen

Sudo eskaliert, sodass root effektiv der Benutzer ist. Wenn Sie Ihren eigenen Benutzer definieren möchten, empfehle ich die Erstellung eines -u/--user-Flags, damit Sie etwas wie sudo ./foo.py -u myUser ausführen können usw.

3voto

decalage Punkte 63

Ich habe das plx-Modul vor einiger Zeit geschrieben, um den Benutzernamen auf Unix und Windows (unter anderem) auf eine portable Weise zu erhalten: http://www.decalage.info/de/python/plx

Verwendung:

import plx

username = plx.get_username()

(Es erfordert Win32-Erweiterungen unter Windows)

3voto

Michael Kropat Punkte 13402

Sie können den aktuellen Benutzernamen unter Windows abrufen, indem Sie über die Windows-API gehen, obwohl es etwas umständlich ist, sie über die ctypes FFI aufzurufen (GetCurrentProcess OpenProcessToken GetTokenInformation LookupAccountSid).

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

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).

-4voto

RobD Punkte 79

Dies funktioniert für mich:

import os
os.cmd("whoami")
print (os.cmd("whoami"))

0 Stimmen

Es gibt kein os.cmd. Ist dies das integrierte Python-os-Modul?

0 Stimmen

Ja, das eingebaute os-Modul. Ausführung von Python 3.7 auf einem Pi4B mit RaspberryOS Buster.

0 Stimmen

Hmm, interessant, denn es ist nicht in den Python 3.7-Dokumenten für das os-Modul aufgeführt.

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