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

784

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.

1214

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

import socket
print(socket.gethostname())
4
  • 93
    Y tenga en cuenta que para el FQDN puede usarsocket.getfqdn()Dave Forgac 21 feb 2013 a las 19:55
  • 15
    Solo tengo curiosidad por saber cuál es la diferencia entre socket.gethostname () y os.uname () [1] o platform.uname () [1]LetsOMG 23/03/18 a las 21:52
  • 1
    ¿Es esto portátil? Charlie Parker 26/04/18 a las 2:01
  • ¿Cómo obtener un nombre de host sin sufijo DNS? iEfimoff 1 de julio a las 19:52
424

Ambos son bastante portátiles:

import platform
platform.node()

import socket
socket.gethostname()

Las soluciones que utilizan las variables de entorno HOSTo HOSTNAMEno son portátiles. Incluso si funciona en su sistema cuando lo ejecuta, es posible que no funcione cuando se ejecuta en entornos especiales como cron.

8
  • 8
    Bueno, semi-portátil. En algunas plataformas, platform.node () da el fqdn y en otras, solo el nombre de hostraindog308 16 de noviembre de 2014 a las 4:31
  • 4
    python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loopBelow the Radar 27/02/2017 a las 13:17
  • 12
    python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loopBelow the Radar 27/02/2017 a las 13:17
  • 18
    @BelowtheRadar no se preocupe, por lo general solo llamo a cualquiera de estos una vez por script. robert 1 de marzo de 2017 a las 11:58
  • 10
    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]debe ser multiplataforma y admitir variables de entorno si existen, lo que permite cierto control del usuario en circunstancias exigentes, pHOSTNAME=correct python xyz.py . EjOrwellophile 7 de abril de 2017 a las 1:55
147

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

import os
myhost = os.uname()[1]
8
  • 11
    +1 para una solución usando el osmódulo. No es portátil y no es realmente preciso, pero de todos modos es útil. MestreLion 27 de julio de 2013 a las 3:25
  • 28
    os.uname no es compatible con Windows: docs.python.org/dev/library/os#os.unameNoam Manos 26 de agosto de 2014 a las 12:22
  • 12
    También puede hacer os.uname (). Nodename para hacerlo un poco más obvio en 3.3+Hut8 10 de mayo de 2015 a las 18:21
  • 4
    Una respuesta a continuación da un aspecto similar platform.uname()[1], que SÍ funciona en Windows. fantabolous 16 de septiembre de 2015 a las 7:00
  • 9
    @fantabolous Probablemente no debería usar palabras de posición como "abajo" ya que las respuestas pueden haber cambiado durante el aterrizaje;)Jonathan Komar 5/04/2016 a las 10:46
70

Qué pasa :

import platform

h = platform.uname()[1]

En realidad, es posible que desee echar un vistazo a todos los resultados en platform.uname()

1
  • 1
    Trabajó en Ubuntu y Windows para mí. ¡Gracias! 👍GollyJer 3 oct 2018 a las 21:10
62

os.getenv('HOSTNAME')y os.environ['HOSTNAME']no siempre funciona. 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 completo, 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 en el que 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.

2
  • 15
    probablemente quieras socket.getfqdn(), aunque no es lo que pide el OPjfs 19 de enero de 2013 a las 3:02
  • socket.gethostbyaddr(socket.gethostname())en mi máquina (que está ejecutando FreeBSD) regresa ('localhost', ['my-machine-name', 'my-machine-namelocaldomain'], ['::1']), por lo que devolver el primer elemento simplemente regresa localhost. (Mientras tanto, socket.gethostname()vuelve my-machine-namepor mí.)jamesdlin 12 de mayo a las 0:34
23

Desde al menos python> = 3.3 :

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

os.uname().nodename

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

3
  • Esto no me funciona en Python 3.8. Charles Plager 12 de enero a las 13:48
  • Según el documento , os.unamesolo está disponible en "versiones recientes de Unix"Pedru 9 de marzo a las 12:16
  • @CharlesPlager Me funcionó en Python 3.8.6, contenedor RHEL7 ejecutándose en OpenShiftdiman82 20 de marzo a las 19:54
19

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

>> import socket
>> socket.gethostname()
'terminus'
12

socket.gethostname() podría hacer

6

En algunos sistemas, el nombre de host se establece en el entorno. Si ese es su caso, el módulo del sistema operativo puede extraerlo del entorno a través de os.getenv . Por ejemplo, si HOSTNAME es la variable de entorno que contiene lo que desea, lo siguiente 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 web y funcionó para mí en ese momento. Debido a la falta de portabilidad, probablemente no usaría esto ahora. Sin embargo, dejo 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 del sistema operativo. Pruébelo: si no funciona en todos los entornos en los que espera que funcione su programa, utilice una de las otras soluciones proporcionadas.

5
  • 6
    Eso devuelve "Ninguno" para mí. De acuerdo con el enlace que publicó, eso significa que la variable 'HOSTNAME' no existe ...: - /John 24/11/10 a las 22:16
  • @John: ¿Estás en Windows? Me funcionó en una caja de Linux, pero también obtengo None en Windows. GreenMatt 25/11/10 a las 23:23
  • @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. Modifiqué la respuesta. GreenMatt 6 mar 14 a las 19:11
  • No funciona en lenovo NAS, devuelve Ninguno. Ahora estoy usando import socket print (socket.gethostname ())Rui Martins 15 de diciembre de 2015 a las 4:48
  • @RuiMartins: Como dije, no parece funcionar en todas partes. Me alegro de que hayas encontrado algo que funcione. GreenMatt 15/12/15 a las 14:20
6

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

Para Windows utilicé:

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

Donde defaultValue es una cadena para evitar que se devuelva None

5
  • 15
    COMPUTERNAME es una variable de entorno muy exclusiva de Microsoft y, por lo tanto, no es portátil. Dwight Spencer 5/10/15 a las 16:34
  • 1
    Sí, pero funciona para sistemas MS y, si encaja, funciona. Muchas veces la gente aquí se enreda demasiado en la velocidad o la independencia de la plataforma cuando la practicidad y la pregunta los vuelven irrelevantes. Bill Kidd 6/10/15 a las 21:09
  • 9
    @BillKidd OP menciona Windows, OS X y Linux en la pregunta, por lo que la necesidad de portabilidad del sistema es una suposición muy razonable. zstewart 10/11/15 a las 20:07
  • 1
    @BillKidd Si bien en general es cierto que debe evitar la optimización o la portabilidad prematuras, no usar una solución fácilmente disponible y posiblemente más fácil de mantener porque es más portátil es ir al extremo opuesto. Mad Physicist 1/04/2016 a las 19:08
  • socket.gethostname () es mejor que os.environ ['COMPUTERNAME']. Porque os.environ ['COMPUTERNAME'] no admite nombres largos de PC después de que lo usé. Ethan Kuo 16 de junio a las 16:18
3

Tienes que ejecutar esta línea de código

sock_name = socket.gethostname()

Y luego puede usar el nombre para encontrar la dirección:

print(socket.gethostbyname(sock_name))
2

Para obtener un nombre de host completamente calificado, use socket.getfqdn ()

import socket

print socket.getfqdn()