¿Hay alguna forma portátil de obtener el nombre de usuario del usuario actual en Python (es decir, una 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 quizás solo estaba buscando en Google mal). El módulo pwd proporciona una forma relativamente fácil de lograr esto en, por ejemplo, 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.
                    
                        python
                                portability
                                username
                                
                    
                    
                        Jacob Gabrielson
fuente
                
                fuente

import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecosoimport pwd, os; print pwd.getpwuid(os.getuid()).pw_nameRespuestas:
Mira el módulo getpass
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 para cualquier otro propósito, ya que permite a cualquier usuario suplantar a cualquier otro ) " .
fuente
Su mejor apuesta sería combinar
os.getuid()conpwd.getpwuid():Consulte los documentos de pwd para obtener más detalles:
http://docs.python.org/library/pwd.html
fuente
pwd.getpwuid(os.getuid()).pw_name.ImportError: No module named pwdsudocaso correctamente. (Soy consciente de que el OP no solicitó sistemas similares a Unix.)También puedes usar:
fuente
Probablemente puedas usar:
o
Pero no será seguro porque las variables de entorno se pueden cambiar.
fuente
os.getenv(...)está en desuso a favor deos.environ[...].os.getenvno parece estar en desuso ...?Estos podrían funcionar. No sé cómo se comportan cuando se ejecutan como un servicio. Ellos no son portátiles, pero eso es lo que
os.nameyifdeclaraciones son para.Ver: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
fuente
SET USERNAME=FAKEantes de su comando de PythonSi necesita esto para obtener el directorio de inicio del usuario, a continuación podría considerarse portátil (win32 y linux al menos), parte de una biblioteca estándar.
También podría analizar dicha cadena para obtener solo el último componente de ruta (es decir, nombre de usuario).
Ver: os.path.expanduser
fuente
Para mí, usar el
osmódulo se ve mejor para la portabilidad: funciona mejor tanto en Linux como en Windows.Salida:
Ventanas:
Linux:
No es necesario instalar ningún módulo o extensión.
fuente
Combinado
pwdygetpassenfoque, basado en otras respuestas:fuente
Para UNIX, al menos, esto funciona ...
editar: acabo de buscarlo y esto funciona en Windows y UNIX:
En UNIX, devuelve su nombre de usuario, pero en Windows, devuelve el grupo de su usuario, barra oblicua, su nombre de usuario.
-
ES DECIR
UNIX devuelve: "nombre de usuario"
Windows devuelve: "dominio / nombre de usuario"
-
Es interesante, pero probablemente no sea ideal a menos que esté haciendo algo en el terminal de todos modos ... en cuyo caso probablemente estaría usando
os.systempara empezar. Por ejemplo, hace un tiempo necesitaba agregar mi usuario a un grupo, así que lo hice (esto está en Linux, eso sí)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.
fuente
domain/userno regresagroup/useruser = subprocess.check_output("whoami").replace("\r\n", "")chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pidno tengo a nadie . segundo,user = subprocess.check_output("whoami").strip()es más portátil que los reemplazos de alimentación de línea anteriores.commandsvssubprocessparece quisquilloso pero faltan comandos en python 3.Escribí el módulo plx hace algún tiempo para obtener el nombre de usuario de forma portátil en Unix y Windows (entre otras cosas): http://www.decalage.info/en/python/plx
Uso:
(requiere extensiones win32 en Windows)
fuente
Usando solo libs de python estándar:
Funciona en Windows, Mac o Linux
Alternativamente, puede eliminar una línea con una invocación inmediata:
fuente
Puede obtener el nombre de usuario actual en Windows yendo a través de la API de Windows, aunque es un poco engorroso invocarlo a través de los ctypes FFI ( GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid ).
Escribí un pequeño módulo que puede hacer esto directamente desde Python, getuser.py . Uso:
Funciona tanto en Windows como en * nix (este último utiliza el
pwdmódulo como se describe en las otras respuestas).fuente