¿Cómo puedo usar Python para obtener el nombre de host del sistema?

681

Estoy escribiendo un programa de chat para una red local. Me gustaría poder identificar computadoras y obtener el nombre de computadora configurado por el usuario con Python.

Juan
fuente

Respuestas:

1043

Uso sockety su gethostname()funcionalidad. Esto obtendrá la hostnamede la computadora donde se ejecuta el intérprete de Python:

import socket
print(socket.gethostname())
Alex
fuente
70
Bueno, eso no es correcto. Funciona para mí fuera de línea y en casa, pero ahora soy una oficina y esto me devuelve un nombre de host diferente.
DataGreed
74
Y tenga en cuenta que para el FQDN puede usarsocket.getfqdn()
Dave Forgac
31
@DataGreed es porque su nombre de host está cambiando. No es problema de Python.
strickli
44
@DataGreed 1. Estoy bastante seguro de que no es "aleatorio", aunque puede parecerle así. 2. La pregunta decía "nombre de host del sistema", no "nombre del sistema". 3. Para una gran cantidad de sistemas (sin incluir ventanas), los nombres de host y sistema son los mismos.
strickli
8
Es curioso cuál es la diferencia entre socket.gethostname () y os.uname () [1] o platform.uname () [1]
LetsOMG el
388

Ambos son bastante portátiles:

import platform
platform.node()

import socket
socket.gethostname()

Cualquier solución utilizando las HOSTo HOSTNAMEvariables de entorno no son portátiles. Incluso si funciona en su sistema cuando lo ejecuta, puede no funcionar cuando se ejecuta en entornos especiales como cron.

robert
fuente
66
Bueno, semi-portátil. En algunas plataformas, platform.node () da el fqdn y en otras, solo el nombre de host
raindog308
3
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
Debajo del radar
8
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
Debajo del radar
77
@BelowtheRadar no te preocupes, generalmente solo llamo a cualquiera de estos una vez por script.
robert
66
platform.node () es incluso más rápido que os.getenv. gethostname ni siquiera es un contendiente. Pero si el tiempo no es un factor: import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]debería ser multiplataforma y admitir variables de entorno si existen, lo que permite cierto control del usuario en circunstancias exigentes, por ejemploHOSTNAME=correct python xyz.py
Orwellophile
121

Probablemente cargará el módulo os de todos modos, por lo que otra sugerencia sería:

import os
myhost = os.uname()[1]
mike0042
fuente
8
+1 para una solución con osmódulo. No es portátil y no es realmente preciso, pero útil de todos modos.
MestreLion
20
os.uname no es compatible con Windows: docs.python.org/dev/library/os#os.uname
Noam Manos
99
También puede hacer os.uname (). Nodename para hacerlo un poco más obvio en 3.3+
Hut8
44
Una respuesta a continuación da una apariencia similar platform.uname()[1], que funciona en Windows.
fantabolous
66
@fantabolous Probablemente no deberías usar palabras posicionales como "debajo" ya que las respuestas pueden haber cambiado durante el aterrizaje;)
Jonathan Komar
65

Qué pasa :

import platform

h = platform.uname()[1]

En realidad, es posible que desee ver todos los resultados en platform.uname()

Lucien Hercaud
fuente
1
Trabajé en Ubuntu y Windows para mí. ¡Gracias! 👍
GollyJer
61

os.getenv('HOSTNAME')y os.environ['HOSTNAME']no siempre funcionan En trabajos cron y WSDL, HTTP HOSTNAME no está configurado. Use esto en su lugar:

import socket
socket.gethostbyaddr(socket.gethostname())[0]

Siempre (incluso en Windows) devuelve un nombre de host totalmente calificado, incluso si definió un alias corto en / etc / hosts .

Si ha definido un alias en / etc / hosts y luego socket.gethostname()regresarán el alias. platform.uname()[1]hace lo mismo

Me encontré con un caso donde lo anterior no funcionó. Esto es lo que estoy usando ahora:

import socket
if socket.gethostname().find('.')>=0:
    name=socket.gethostname()
else:
    name=socket.gethostbyaddr(socket.gethostname())[0]

Primero llama a gethostname para ver si devuelve algo que se parece a un nombre de host, si no, usa mi solución original.

Tom Ekberg
fuente
15
probablemente quieras socket.getfqdn(), aunque no es lo que pide el OP
jfs
17

Si estoy en lo correcto, está buscando la función socket.gethostname:

>> import socket
>> socket.gethostname()
'terminus'
término
fuente
13

Desde al menos python> = 3.3 :

Puede usar el campo nodenamey evitar usar la indexación de matriz:

os.uname().nodename

Aunque, incluso la documentación de os.uname sugiere usarsocket.gethostname()

Shubham Chaudhary
fuente
11

socket.gethostname() podría hacer

vpit3833
fuente
5

En algunos sistemas, el nombre de host se establece en el entorno. Si ese es su caso, el módulo os puede sacarlo del entorno a través de os.getenv . Por ejemplo, si HOSTNAME es la variable de entorno que contiene lo que desea, lo obtendrá:

import os
system_name = os.getenv('HOSTNAME')

Actualización: como se señaló en los comentarios, esto no siempre funciona, ya que no todos los entornos están configurados de esta manera. Creo que en el momento en que inicialmente respondí esto estaba usando esta solución, ya que era lo primero que encontré en una búsqueda en la web y funcionó para mí en ese momento. Debido a la falta de portabilidad, probablemente no usaría esto ahora. Sin embargo, estoy dejando esta respuesta para fines de referencia. FWIW, elimina la necesidad de otras importaciones si su entorno tiene el nombre del sistema y ya está importando el módulo os. Pruébelo: si no funciona en todos los entornos en los que espera que funcione su programa, utilice una de las otras soluciones proporcionadas.

GreenMatt
fuente
55
Eso me devuelve "Ninguno". Según el enlace que publicó, eso significa que la variable 'HOSTNAME' no existe ...: - /
John
@ John: ¿Estás en Windows? Funcionó para mí en una caja de Linux, pero también obtengo None en Windows.
GreenMatt
@MuhiaNJoroge: Creo que eso depende de su implementación / instalación. Cuando escribí esa respuesta estaba en una caja de Red Hat y funcionó. Ahora estoy en Ubuntu y no funciona. He modificado la respuesta.
GreenMatt
No funciona en NAS de Lenovo, no devuelva ninguno. Ahora estoy usando import socket print (socket.gethostname ())
Rui Martins
@RuiMartins: Como dije, no parece funcionar en todas partes. Me alegra que hayas encontrado algo que funcione.
GreenMatt
5

Necesitaba el nombre de la PC para usar en mi archivo de configuración PyLog, y la biblioteca de sockets no está disponible, pero la biblioteca os sí.

Para Windows utilicé:

os.getenv('COMPUTERNAME', 'defaultValue')

Donde defaultValue es una cadena para evitar que se devuelva None

Bill Kidd
fuente
12
COMPUTERNAME es una variable de entorno muy exclusiva de Microsoft y, por lo tanto, no es portátil.
Dwight Spencer
1
Sí, pero funciona para sistemas MS, y si encaja, funciona. Muchas veces las personas aquí se entrelazan demasiado con la velocidad o la independencia de la plataforma cuando la practicidad y la pregunta los vuelven irrelevantes.
Bill Kidd
77
@BillKidd OP menciona Windows, OS X y Linux en la pregunta, por lo que necesitar portabilidad del sistema es una suposición muy razonable.
zstewart
1
@BillKidd Si bien, en general, es cierto que debe evitar la optimización o portabilidad prematuras, no utilizar una solución fácilmente disponible y posiblemente más sostenible porque es más portátil está yendo al extremo opuesto.
Mad Physicist el
2

Tienes que ejecutar esta línea de código

sock_name = socket.gethostname()

Y luego puedes usar el nombre para encontrar el addr:

print(socket.gethostbyname(sock_name))
Parzifal Kali
fuente