web-dev-qa-db-fra.com

Existe-t-il un moyen portable d'obtenir le nom d'utilisateur actuel en Python?

Existe-t-il un moyen portable d'obtenir le nom d'utilisateur de l'utilisateur actuel dans Python (c'est-à-dire, un système fonctionnant sous Linux et Windows, au moins). Cela fonctionnerait comme os.getuid:

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

J'ai cherché sur Google et j'ai été surpris de ne pas trouver de réponse définitive (même si j'étais peut-être en train de chercher mal sur Google). Le module pwd fournit un moyen relativement facile d'y parvenir sous, disons, Linux, mais il n'est pas présent sous Windows. Certains résultats de recherche suggéraient qu'obtenir le nom d'utilisateur sous Windows pouvait être compliqué dans certaines circonstances (par exemple, en tant que service Windows), bien que je ne l'aie pas encore vérifié.

557

Regardez le module getpass

import getpass
getpass.getuser()
'kostya'

Disponibilité: Unix, Windows


p.s. Par commentaire ci-dessous ", cette fonction examine les valeurs de diverses variables d'environnement pour déterminer le nom d'utilisateur. Cette fonction ne doit donc pas être utilisée à des fins de contrôle d'accès (ou éventuellement à d'autres fins, car il permet à n'importe quel utilisateur d'usurper l'identité d'un autre). "

761

Le mieux serait de combiner os.getuid() avec pwd.getpwuid():

import os
import pwd

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

Reportez-vous à la documentation pwd pour plus de détails:

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

99
Liam Chasteen

Vous pouvez aussi utiliser:

 os.getlogin()
77
Marcin Augustyniak

Vous pouvez probablement utiliser:

os.environ.get('USERNAME')

ou

os.environ.get('USER')

Mais cela ne sera pas sûr car les variables d'environnement peuvent être modifiées.

61
Nadia Alramli

Ceux-ci pourraient fonctionner. Je ne sais pas comment ils se comportent lorsqu'ils fonctionnent en tant que service. Elles ne sont pas portables, mais c’est à quoi servent les instructions os.name et if.

win32api.GetUserName()

win32api.GetUserNameEx(...) 

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

20
Adam

Si vous en avez besoin pour obtenir le répertoire personnel de l'utilisateur, vous pouvez considérer ci-dessous comme portable (win32 et linux au moins), une partie d'une bibliothèque standard.

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

Vous pouvez aussi analyser une telle chaîne pour n’obtenir que le dernier composant de chemin (c’est-à-dire le nom d’utilisateur).

Voir: os.path.expanduser

18
HezniK

Pour moi, utiliser le module os semble être le meilleur en termes de portabilité: fonctionne mieux sous Linux et 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]           

Sortie:

Les fenêtres:

Répertoire personnel de l'utilisateur: C:\Utilisateurs\myuser

nom d'utilisateur: myuser

Linux:

Répertoire personnel de l'utilisateur:/root

nom d'utilisateur: root

Pas besoin d'installer de modules ou d'extensions.

15
user966588

Méthode combinée pwd et getpass, basée sur d'autres réponses:

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

Pour UNIX, au moins, cela fonctionne ...

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

edit: Je viens de le vérifier et cela fonctionne sous Windows et UNIX:

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

Sous UNIX, il renvoie votre nom d'utilisateur, mais sous Windows, il renvoie le groupe de votre utilisateur, la barre oblique, votre nom d'utilisateur.

-

C'EST À DIRE.

UNIX renvoie: "nom d'utilisateur"

Windows renvoie: "domaine/nom d'utilisateur"

-

C'est intéressant, mais probablement pas idéal à moins que vous ne fassiez quelque chose dans le terminal de toute façon ... dans ce cas, vous utiliseriez probablement os.system pour commencer. Par exemple, il y a quelque temps, j'avais besoin d'ajouter mon utilisateur à un groupe, alors je l'ai fait (c'est sous Linux, remarquez)

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"

Je pense que c'est plus facile à lire et vous n'avez pas à importer pwd ou getpass.

Je pense aussi qu’avoir "domaine/utilisateur" pourrait être utile dans certaines applications de Windows.

8
dylnmc

J'ai écrit le module plx il y a quelque temps pour obtenir le nom d'utilisateur de manière portable sous Unix et Windows (entre autres): http://www.decalage.info/en/python/plx

Usage:

import plx

username = plx.get_username()

(il nécessite des extensions win32 sous Windows)

5
decalage

Vous pouvez obtenir le nom d'utilisateur actuel sur Windows en passant par l'API Windows, bien qu'il soit un peu fastidieux d'appeler via les types FFI ( GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid ).

J'ai écrit un petit module qui peut le faire directement depuis Python, getuser.py . Usage:

import getuser
print(getuser.lookup_username())

Cela fonctionne à la fois sur Windows et * nix (ce dernier utilise le module pwd comme décrit dans les autres réponses).

3
Michael Kropat

En utilisant uniquement la bibliothèque python _ standard:

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

Fonctionne sous Windows ou Linux

Vous pouvez également supprimer une ligne avec une invocation immédiate:

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