sistema - ¿Hay una forma portátil de obtener el nombre de usuario actual en Python?
saber la hora con python (12)
¿Existe una forma portátil de obtener el nombre de usuario actual en Python (es decir, uno que funcione tanto en Linux como en Windows, al menos)? Funcionaría como os.getuid
:
>>> os.getuid()
42
>>> os.getusername()
''slartibartfast''
Busqué en Google y me sorprendió no encontrar una respuesta definitiva (aunque tal vez solo lo estaba haciendo mal). El módulo pwd proporciona una forma relativamente fácil de lograr esto en, digamos, Linux, pero no está presente en Windows. Algunos de los resultados de búsqueda sugirieron que obtener el nombre de usuario en Windows puede ser complicado en ciertas circunstancias (por ejemplo, ejecutarse como un servicio de Windows), aunque no lo he verificado.
Combinación de pwd
y getpass
, basado en otras respuestas:
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()
Escribí el módulo plx hace algún tiempo para obtener el nombre de usuario de manera portátil en Unix y Windows (entre otras cosas): http://www.decalage.info/en/python/plx
Uso:
import plx
username = plx.get_username()
(requiere extensiones win32 en Windows)
Estos podrían funcionar. No sé cómo se comportan cuando se ejecutan como un servicio. No son portátiles, pero para eso son las declaraciones "os.name" y "if".
win32api.GetUserName ()
win32api.GetUserNameEx (...)
Consulte: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
La forma más fácil de obtener el nombre de usuario actual es definitivamente el username
.
pip install username
entonces:
import username
print(username())
# your_username
Y también hay un username-cli
, una herramienta CLI para obtener su nombre de usuario, simplemente:
pip install username-cli
entonces:
$ username
# -> your username
Funciona en Linux, macOS y Windows
La mejor apuesta sería combinar os.getuid()
con pwd.getpwuid()
:
import os
import pwd
def get_username():
return pwd.getpwuid( os.getuid() )[ 0 ]
Consulte los documentos pwd para más detalles:
Mira módulo getpass
import getpass
getpass.getuser()
''kostya''
Disponibilidad: Unix, Windows
ps Por comentario a continuación " esta función analiza los valores de varias variables de entorno para determinar el nombre de usuario. Por lo tanto, no se debe confiar en esta función para fines de control de acceso (o posiblemente cualquier otro propósito, ya que permite a cualquier usuario hacerse pasar por otra persona). ) " .
Para UNIX, al menos, esto funciona ...
import commands
username = commands.getoutput("echo $(whoami)")
print username
edición: acabo de buscarlo y esto funciona en Windows y UNIX:
import commands
username = commands.getoutput("whoami")
En UNIX devuelve su nombre de usuario, pero en Windows, devuelve el grupo de su usuario, barra diagonal, su nombre de usuario.
-
ES DECIR
UNIX devuelve: "nombre de usuario"
Windows devuelve: "dominio / nombre de usuario"
-
Es interesante, pero probablemente no sea lo ideal, a menos que esté haciendo algo en el terminal de todos modos ... en cuyo caso es probable que esté usando os.system
para empezar. Por ejemplo, hace un tiempo necesitaba agregar mi usuario a un grupo, así que lo hice (esto es en Linux, claro)
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"
Siento que es más fácil de leer y no tienes que importar pwd o getpass.
También siento que tener "dominio / usuario" podría ser útil en ciertas aplicaciones en Windows.
Para mí, el módulo os
se ve mejor para la portabilidad: funciona mejor en Linux y 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]
Salida:
Windows:
Inicio del usuario Dir: C: / Users / myuser
nombre de usuario: myuser
Linux:
Inicio del usuario Dir: / root
nombre de usuario: root
No hay necesidad de instalar ningún módulo o extensión.
Probablemente puedas usar:
os.environ.get(''USERNAME'')
o
os.environ.get(''USER'')
Pero no va a ser seguro porque las variables de entorno se pueden cambiar.
Puede obtener el nombre de usuario actual en Windows pasando por la API de Windows, aunque es un poco incómodo invocar a través de Fty ctypes ( GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid ).
Escribí un pequeño módulo que puede hacer esto directamente desde Python, getuser.py . Uso:
import getuser
print(getuser.lookup_username())
Funciona tanto en Windows como en * nix (este último usa el módulo pwd
como se describe en las otras respuestas).
Si necesita esto para obtener el directorio de inicio del usuario, a continuación se podría considerar como portátil (win32 y Linux al menos), parte de una biblioteca estándar.
>>> os.path.expanduser(''~'')
''C://Documents and Settings//johnsmith''
También puede analizar dicha cadena para obtener solo el último componente de la ruta (es decir, el nombre de usuario).
Ver: os.path.expanduser
También puedes usar:
os.getlogin()