Est-il un portable de façon à obtenir le nom d'utilisateur en cours en Python?
Est-il un portable de façon à obtenir l'actuel nom de l'utilisateur en Python (c'est à dire, celui qui fonctionne sous Linux et Windows, au moins). Il fonctionnerait comme os.getuid
:
>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'
J'ai googlé autour et a été surpris de ne pas trouver de réponse définitive (bien que peut-être je viens de googler mal). Le pwd module fournit un moyen relativement simple de le faire sous la, dire, sous Linux, mais il n'est pas présent sur Windows. Certains des résultats de la recherche a suggéré que le nom d'utilisateur sous Windows peut être compliqué dans certaines circonstances (par exemple, de fonctionner comme un service Windows), bien que je n'ai pas vérifié.
- Il ne fonctionne pas sur mon Linux!
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecos
ouimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
- getusername() n'est pas valide méthode dans l'os module Python: docs.python.org/2.7/library/os.html
- C'était OP du point là. Il a été d'imaginer comment une telle fonction peut être appelée si elle existait.
Vous devez vous connecter pour publier un commentaire.
Regarder getpass module
Disponibilité: Unix, Windows
p.s. Par commentaire ci-dessous "cette fonction examine les valeurs des différentes variables d'environnement pour déterminer le nom de l'utilisateur. Par conséquent, cette fonction ne doit pas être invoqué pour l'accès à des fins de contrôle (ou éventuellement tout autre but, car elle permet à un utilisateur d'usurper l'identité d'une autre)."
su
. Peut-être que tu voulais l'utilisersu - julia
.USER
variable n'est pas toujours, par exemple dans un récipient. Cependant, j'ai testégetuser()
en Python 3.6.3 et 2.7.11 avecUSER
unset, et il fonctionne toujours.Vous meilleur pari serait de combiner
os.getuid()
avecpwd.getpwuid()
:Reportez-vous à la ddt documentation pour plus de détails:
http://docs.python.org/library/pwd.html
pwd.getpwuid(os.getuid()).pw_name
.Vous pouvez également utiliser:
Vous pouvez probablement utiliser:
ou
Mais il ne va pas être en sécurité parce que les variables d'environnement peuvent être modifiés.
os.getenv(...)
est déconseillée en faveur deos.environ[...]
.os.getenv
qui ne semble pas être obsolète..?os.getenv('USER')
Ces pourrait fonctionner. Je ne sais pas comment ils se comportent lors de l'exécution en tant que service. Ils ne sont pas portable, mais c'est ce que
os.name
etif
consolidés.Voir:
http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
SET USERNAME=FAKE
avant votre commande pythonSi vous avez besoin pour obtenir de l'utilisateur à la maison dir, ci-dessous pourrait être considéré comme portable (win32 et linux au moins), une partie de la bibliothèque standard.
Vous pouvez également analyser une telle chaîne pour obtenir uniquement le dernier chemin composant (ie. nom d'utilisateur).
Voir: os.chemin d'accès.expanduser
M'aide
os
module semble le meilleur pour la portabilité: Fonctionne le mieux sur Linux et Windows.De sortie:
Windows:
Linux:
Pas besoin d'installer tous les modules ou extensions.
Combiné
pwd
etgetpass
de l'approche fondée sur d'autres réponses:Pour UNIX, au moins, cela fonctionne...
edit:
Je viens de regardé et cela fonctionne sur Windows et UNIX:
Sur UNIX, il retourne votre nom d'utilisateur, mais sur Windows, il renvoie l'utilisateur de votre groupe, slash, votre nom d'utilisateur.
--
I. E.
UNIX renvoie: "nom d'utilisateur"
Windows renvoie: "domaine/nom d'utilisateur"
--
C'est intéressant, mais sans doute pas l'idéal, sauf si vous faites quelque chose dans le terminal de toute façon... dans ce cas, vous serait probablement à l'aide de
os.system
pour commencer. Par exemple, il y a un moment j'ai besoin d'ajouter mon utilisateur à un groupe, donc je l'ai fait (c'est dans Linux, vous l'esprit)J'ai la sensation que c'est plus facile à lire et vous n'avez pas à importer pwd ou getpass.
J'ai aussi l'impression d'avoir "domaine/utilisateur" pourrait être utile dans certaines applications Windows.
domain/user
pasgroup/user
user = subprocess.check_output("whoami").replace("\r\n", "")
chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid
je suis personne. deuxièmement,user = subprocess.check_output("whoami").strip()
est plus portable que le remplacement des sauts de ligne au-dessus.commands
vssubprocess
semble pinailleurs mais des commandes est manquant à partir de python 3.J'ai écrit le plx module il y a quelques temps pour obtenir le nom d'utilisateur de façon portable sur Unix et Windows (entre autres choses):
http://www.decalage.info/en/python/plx
Utilisation:
(il faut win32 extensions sur Windows)
Vous pouvez obtenir le nom d'utilisateur sur Windows en passant par l'API Windows, même si c'est un peu lourd à invoquer via le ctypes FFI (Fonction getcurrentprocess → OpenProcessToken → GetTokenInformation → LookupAccountSid).
J'ai écrit un petit module qui permet de le faire directement à partir de Python, getuser.py. Utilisation:
Il fonctionne sur Windows et *nix (le deuxième utilise le
pwd
module comme décrit dans les autres réponses).En utilisant uniquement standard de python libs:
Fonctionne sur Windows ou Linux
Sinon, vous pouvez supprimer une ligne dans l'immédiat, l'invocation: