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é.
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). "
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:
Vous pouvez aussi utiliser:
os.getlogin()
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.
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
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
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.
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()
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.
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)
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 ( GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid ).
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).
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"])()