2009-05-08 5 views
456

C'è un modo portabile per ottenere il nome utente dell'utente corrente in Python (ad esempio, uno che funziona con Linux e Windows, almeno). Funzionerebbe come os.getuid:C'è un modo portatile per ottenere il nome utente corrente in Python?

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

Googled intorno e sono rimasto sorpreso di non trovare una risposta definitiva (anche se forse ero appena googling male). Il modulo pwd fornisce un modo relativamente facile per ottenere questo sotto, per esempio, Linux, ma non è presente su Windows. Alcuni dei risultati della ricerca suggerivano che ottenere il nome utente sotto Windows può essere complicato in determinate circostanze (ad es., Come servizio Windows), sebbene non l'abbia verificato.

+0

Non funziona sulla mia macchina Linux! – Riccardo

+2

'importazione pwd, os; stampa pwd.getpwuid (os.getuid()). pw_gecos' o 'importa pwd, os; print pwd.getpwuid (os.getuid()). pw_name' – chown

+0

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

risposta

621

Guarda getpass modulo

import getpass 
getpass.getuser() 
'kostya' 

Disponibilità: Unix, Windows


P.S. Per commento sotto "questa funzione controlla i valori di varie variabili d'ambiente per determinare il nome utente. Pertanto, questa funzione non dovrebbe essere invocata per scopi di controllo degli accessi (o eventualmente per altri scopi, poiché consente a qualsiasi utente di impersonare qualsiasi altro .) "

+88

Sembra che questa funzione guardi i valori di varie variabili d'ambiente per determinare il nome utente. Pertanto, questa funzione non dovrebbe essere invocata per scopi di controllo di accesso (o eventualmente per altri scopi, poiché consente a qualsiasi utente di impersonare un altro). –

+16

Non c'è niente di sbagliato in getpass.getuser(), poiché non pretende di autenticare l'utente. Lo scopo della funzione è determinare chi è l'utente che afferma di essere senza chiedere direttamente all'utente. –

+7

Che non funziona se hai fatto un su. $ echo $ USER hithwen $ su julia Password: $ echo $ USER julia $ python getpass >>> >>> importazione getpass.getuser() 'hithwen' – hithwen

45

probabilmente si può usare:

os.environ.get('USERNAME') 

Ma non sta andando essere sicuro, perché le variabili di ambiente possono essere cambiati.

+13

'os.getenv (...)' è deprecato a favore di 'os.environ [...]'. –

+9

Non dovrebbe essere USER invece di USERNAME? –

+6

@MikeGraham ['os.getenv'] (http://docs.python.org/dev/library/os.html#os.getenv) non sembra essere deprecato ..? – dbr

60

È anche possibile utilizzare:

os.getlogin() 
+23

Su linux, getlogin() restituisce il nome dell '"utente che ha effettuato l'accesso sul terminale di controllo del processo." Quindi fallisce quando non c'è un terminale di controllo, ad esempio in un'applicazione mod_python. –

+14

Non disponibile per Windows –

+0

funziona su Windows 8, 64b, collegato a un dominio – scape

17

Queste potrebbero funzionare. Non so come si comportano quando si esegue come un servizio. Non sono portabili, ma questo è ciò che le istruzioni "os.name" e "if" servono.

win32api.GetUserName()

win32api.GetUserNameEx (...)

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

+2

Er, la parola "portatile" è in questione .. – JBRWilkinson

+23

Questa risposta è utile almeno quanto la (inutile) risposta a un voto di soli univoco di 25 voti. –

+1

> "Almeno utile" Concordato. Presumibilmente la risposta giusta è una combinazione dei due. –

5

ho scritto il modulo PLX qualche tempo fa per ottenere il nome utente in un modo portabile su Unix e Windows (tra le altre cose): http://www.decalage.info/en/python/plx

Usage:

import plx 

username = plx.get_username() 

(richiede estensioni Win32 su Windows)

93

È migliore da fare sarebbe quella di combinare os.getuid() con pwd.getpwuid():

import os 
import pwd 

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

Fare riferimento alla documentazione pwd per maggiori dettagli:

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

+34

In alternativa (leggermente più bello da leggere): 'pwd.getpwuid (os.getuid()). Pw_name'. –

+44

Non funziona su Windows (come indicato nella domanda originale) – Truan

+3

-1 Non funziona su Windows –

14

Se si ha bisogno di questo per ottenere la directory home dell'utente, di seguito potrebbe essere considerato come tabella (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 esempio il nome utente).

See: os.path.expanduser

+3

La directory home di qualcuno non riflette sempre il proprio nome utente. – dreamlax

9

combinata pwd e getpass approccio, sulla base di 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() 
3

È possibile ottenere il nome utente corrente su Windows passando attraverso l'API di Windows, anche se è un po 'ingombrante per invocare tramite i tipi di codice FFI (GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid).

Ho scritto un piccolo modulo che può farlo direttamente da Python, getuser.py. Uso:

import getuser 
print(getuser.lookup_username()) 

Funziona sia su Windows e * nix (il secondo usa il modulo pwd come descritto nelle altre risposte).

12

Per me utilizzare il modulo os sembra il migliore per la portabilità: Funziona meglio sia su Linux che su 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]   

uscita:

di Windows:

User's home Dir: C:\Users\myuser

username: myuser

Linux:

User's home Dir: /root

username: root

Non c'è bisogno di installare alcun moduli o estensioni.

+9

Questa soluzione è intelligente, ma fa alcune supposizioni che non sono sempre vere. Non c'è alcun vincolo che richiede che lo username appaia nel percorso homedir su Linux. Succede di essere il caso la maggior parte delle volte, ma un amministratore di sistema può impostare l'homedir di un utente per quello che vuole. –

6

Per UNIX, almeno, questo funziona ...

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

edit: ho appena guardato in su e questo funziona su Windows e UNIX:

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

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

-

I.E.

UNIX ritorna: "username"

Windows restituisce: "dominio/nomeutente"

-

E 'interessante, ma probabilmente non è l'ideale se non si sta facendo qualcosa nel terminale in ogni caso. .. nel qual caso probabilmente useresti os.system per cominciare.Per esempio, qualche tempo fa avevo bisogno di aggiungere il mio utente a un gruppo, così ho fatto (questo è in Linux, si badi bene)

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" 

mi sento come che è più facile da leggere e non lo fai devi importare pwd o getpass.

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

+1

WIndows restituisce 'dominio/utente' non' gruppo/utente' – RealHowTo

+1

Il modulo comandi non funziona su Windows. È un modulo specifico UNIX (vedi https://docs.python.org/2/library/commands.html). Ora è deprecato e il sottoprocesso è raccomandato. 'user = subprocess.check_output (" whoami "). Replace (" \ r \ n "," ")' – ConnectedSystems

+0

k; quindi utilizzare il sottoprocesso ... jeez – dylnmc