¿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_gecos
oimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
Respuestas:
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 pwd
sudo
caso 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.getenv
no 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.name
yif
declaraciones son para.Ver: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
fuente
SET USERNAME=FAKE
antes 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
os
mó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
pwd
ygetpass
enfoque, 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.system
para 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/user
no regresagroup/user
user = subprocess.check_output("whoami").replace("\r\n", "")
chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid
no 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.commands
vssubprocess
parece 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
pwd
módulo como se describe en las otras respuestas).fuente