Esiste un modo portatile per ottenere l'attuale nome utente in Python?


598

Esiste un modo portatile per ottenere il nome utente dell'utente corrente in Python (ovvero, uno che funziona almeno su Linux e Windows). Funzionerebbe come os.getuid:

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

Ho cercato su Google e sono rimasto sorpreso di non trovare una risposta definitiva (anche se forse stavo solo cercando male su Google). Il modulo pwd fornisce un modo relativamente semplice per ottenere ciò sotto, diciamo, Linux, ma non è presente su Windows. Alcuni dei risultati della ricerca hanno suggerito che ottenere il nome utente in Windows può essere complicato in determinate circostanze (ad esempio, in esecuzione come un servizio Windows), anche se non l'ho verificato.


Non funziona sul mio box Linux!
Riccardo,

5
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecosoppureimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
vestito dal

getusername () non è un metodo valido nel modulo os Python: docs.python.org/2.7/library/os.html
Matt Bruzek

17
@MattBruzek Questo era il punto di OP. Stava immaginando come una tale funzione potesse essere chiamata se esistesse.
colpì il

Risposte:


836

Guarda il modulo getpass

import getpass
getpass.getuser()
'kostya'

Disponibilità: Unix, Windows


ps Per commento sotto " questa funzione esamina i valori di varie variabili d'ambiente per determinare il nome utente. Pertanto, questa funzione non dovrebbe essere invocata per scopi di controllo dell'accesso (o possibilmente per qualsiasi altro scopo, poiché consente a qualsiasi utente di impersonare qualsiasi altro ). "


100
Sembra che questa funzione guardi i valori di varie variabili d'ambiente per determinare il nome utente. Pertanto, questa funzione non deve essere invocata a fini di controllo dell'accesso (o eventualmente per qualsiasi altro scopo, poiché consente a qualsiasi utente di impersonare qualsiasi altro).
Greg Hewgill

25
Non c'è nulla di sbagliato in getpass.getuser (), poiché non pretende di autenticare l'utente. Lo scopo della funzione è determinare chi sta sostenendo di essere senza chiedere direttamente all'utente.
Walker Hale IV,

7
Questo non funziona se hai fatto una causa. $ echo $ USER hithwen $ su julia Password: $ echo $ USER julia $ python >>> import getpass >>> getpass.getuser () 'hithwen'
hithwen

6
@GregHewgill solleva un ottimo punto, ma in effetti, scoprire il nome utente in un modo semplice non autenticato come questo ha alcune applicazioni. Il mio caso d'uso attuale: taggare alcune risorse di test condivise con un nome utente per una facile pulizia in seguito. (Quindi è più facile capire di chi è il caos di chi.)
driftcatcher

16
E sono d'accordo con @GregHewgill ai fini del controllo degli accessi, ma non sono completamente d'accordo con "qualsiasi altro scopo" - è come dire "Non usare $ USER in uno script di shell". Ottimo punto sul controllo degli accessi ma ci sono molti altri usi che non implicano l'autenticazione.
nevelis,

119

La soluzione migliore sarebbe combinare os.getuid()con pwd.getpwuid():

import os
import pwd

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

Fare riferimento ai documenti pwd per maggiori dettagli:

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


51
In alternativa (un po 'più bello per leggere): pwd.getpwuid(os.getuid()).pw_name.
Brian M. Hunt,

6
Cosa fa su Windows? Forse si potrebbe provare questo, e se fallisce, ricorrere ai metodi 'getpass / env var'.
Jonathan Hartley,

2
Questo è il modo corretto se hai bisogno di ottenere il nome utente sia con che senza effettuare l'accesso.
Derrick Zhang,

5
@JonathanHartley:ImportError: No module named pwd
Justin

1
Questo metodo è su sistemi unix-like molto superiori alla risposta di Konstantin Tenzin, perché gestisce sudocorrettamente il caso. (Sono consapevole che l'OP non ha richiesto; t chiedere sistemi simili a unix.)
halloleo

86

Puoi anche usare:

 os.getlogin()

29
Su Linux, getlogin () restituisce il nome dell '"utente connesso al terminale di controllo del processo". Quindi fallisce quando non c'è un terminale di controllo, ad esempio in un'applicazione mod_python.
Vebjorn Ljosa,

23
Non disponibile per Windows
Walker Hale IV,

3
Se hai usato su, questo non restituirà l'utente corrente, ma l'utente originariamente connesso.
Trevor Allred,

4
funziona su Windows ... Python 3.4.1 (v3.4.1: c0e311e010fc, 18 maggio 2014, 10:38:22) [MSC v.1600 32 bit (Intel)] su win32 Digita "help", "copyright", "crediti" o "licenza" per ulteriori informazioni. >>> import os; os.getlogin () 'jrb'
Naib,

5
È disponibile solo su Windows per Python 3.x.
Zitrax,

71

Probabilmente puoi usare:

os.environ.get('USERNAME')

o

os.environ.get('USER')

Ma non sarà sicuro perché le variabili di ambiente possono essere modificate.


18
os.getenv(...)è deprecato a favore di os.environ[...].
Mike Graham,

11
Non dovrebbe essere USER anziché USERNAME?
Karl Bartel,

7
@MikeGraham os.getenvnon sembra essere deprecato ..?
dbr

4
Sì, esattamente USER vs USERNAME è esattamente ciò che non è portatile, quindi non fornisce la risposta corretta.
Peter M

2
USERNAME è per Windows, USER è per Linux
Sabrina,

22

Questi potrebbero funzionare. Non so come si comportano quando funzionano come un servizio. Non sono portatili, ma questo è ciò os.nameche ifserve e le dichiarazioni.

win32api.GetUserName()

win32api.GetUserNameEx(...) 

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


30
Questa risposta è utile almeno quanto la (inutile) risposta unix unica votata a 25 voti.
Tom B,

3
> "Almeno altrettanto utile" Concordato. Presumibilmente la risposta giusta è una combinazione dei due.
Jonathan Hartley,

Se sei bloccato su Python 2 su Windows, questo è l'unico modo sicuro per farlo. Tutti gli altri modi possono essere ingannati eseguendo SET USERNAME=FAKEprima del comando python
CodeKid

21

Se questo è necessario per ottenere la home directory dell'utente, di seguito potrebbe essere considerato portatile (almeno win32 e Linux), parte di una libreria standard.

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

Inoltre è possibile analizzare tale stringa per ottenere solo l'ultimo componente del percorso (ad es. Nome utente).

Vedi: os.path.expanduser


9
La home directory di qualcuno non riflette sempre il suo nome utente.
dreamlax,

Funziona su Linux e Windows
Sabrina,

Sfortunatamente, se imposti la variabile HOME in Windows, questo restituirà quel valore.
GLRoman

15

Per me l'uso del osmodulo sembra il migliore per la portabilità: funziona meglio su Linux e 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]           

Produzione:

Finestre:

Dir home dell'utente: C: \ Users \ myuser

nome utente: myuser

Linux:

Dir home dell'utente: / root

nome utente: root

Non è necessario installare alcun modulo o estensione.


16
Questa soluzione è intelligente, ma fa alcune ipotesi che non sono sempre vere. Non ci sono vincoli che richiedono che il nome utente appaia nel percorso homedir su Linux. Succede solo il caso per la maggior parte del tempo, ma un amministratore di sistema può impostare il homedir di un utente su quello che vuole.
Joe Holloway,

L'impostazione della variabile HOME lo elimina.
GLRoman

11

Combinato pwde getpassapproccio, basato su altre risposte:

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

9

Per UNIX, almeno, funziona ...

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

modifica: l' ho appena cercato e funziona su Windows e UNIX:

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

Su UNIX restituisce il tuo nome utente, ma su Windows restituisce il gruppo dell'utente, barra, il tuo nome utente.

-

IE

Restituisce UNIX: "nome utente"

Windows restituisce: "dominio / nome utente"

-

È interessante, ma probabilmente non è l'ideale a meno che tu non stia facendo qualcosa nel terminale ... nel qual caso probabilmente useresti os.systemper cominciare. Ad esempio, qualche tempo fa dovevo aggiungere il mio utente a un gruppo, quindi l'ho fatto (questo è in Linux, intendiamoci)

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"

Sento che è più facile da leggere e non devi importare pwd o getpass.

Sento anche che avere "dominio / utente" potrebbe essere utile in alcune applicazioni di Windows.


1
Windows domain/user non ritornagroup/user
RealHowTo

4
Il modulo comandi non funziona su Windows. È un modulo specifico UNIX (consultare docs.python.org/2/library/commands.html ). Ora è deprecato e si consiglia invece il sottoprocesso. user = subprocess.check_output("whoami").replace("\r\n", "")
ConnectedSystems

K; quindi usa il sottoprocesso ...
jeez

2 osservazioni. command.whoami ha funzionato alla grande, anche nel contesto di un servizio in esecuzione con un nome utente diverso. cioè con chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid non ho nessuno . in secondo luogo, user = subprocess.check_output("whoami").strip() è più portabile rispetto agli alimentatori di linea sostituiti sopra. commandsvs subprocesssembra nitido, ma mancano i comandi da Python 3.
JL Peyret,

5

Ho scritto il modulo plx qualche tempo fa per ottenere il nome utente in modo portatile su Unix e Windows (tra le altre cose): http://www.decalage.info/it/python/plx

Uso:

import plx

username = plx.get_username()

(richiede estensioni win32 su Windows)


4

Utilizzando solo librerie Python standard:

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

Funziona su Windows, Mac o Linux

In alternativa, è possibile rimuovere una riga con una chiamata immediata:

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

1
getpass è anche una lib standard
jodag del

non funziona per me in win10, python3.7.4. mi lamento del fatto che "USER" non sia stato trovato nelle variabili ambientali. Immagino che getpass sia comunque una scelta migliore.
Rika,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.