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


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

Author: Itay Grudev, 2010-11-25

10 answers

Uso socket y su gethostname() la funcionalidad. Esto obtendrá el hostname del equipo donde se está ejecutando el intérprete de Python:

import socket
print(socket.gethostname())
 792
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-10 23:02:05

Ambos son bastante portátiles:

import platform
platform.node()

import socket
socket.gethostname()

Cualquier solución que utilice las variables de entorno HOST o HOSTNAME no es portable. Incluso si funciona en su sistema cuando lo ejecuta, puede que no funcione cuando se ejecuta en entornos especiales como cron.

 303
Author: robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-25 01:19:44

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

import os
myhost = os.uname()[1]
 86
Author: mike0042,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-13 19:06:15

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

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

Siempre (incluso en Windows) devuelve un nombre de host completo, incluso si ha definido un alias corto en /etc/hosts.

Si ha definido un alias en /etc/hosts entonces socket.gethostname() devolverá 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 gethostname para ver si devuelve algo que se parece a un nombre de host, si no utiliza mi solución original.

 53
Author: Tom Ekberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-06 13:40:18

¿Qué pasa con :

import platform

h = platform.uname()[1]

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

 46
Author: Lucien Hercaud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-02 11:31:44

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

>> import socket
>> socket.gethostname()
'terminus'
 15
Author: terminus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-24 21:37:53

socket.gethostname() podría hacer

 10
Author: vpit3833,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-24 21:38:13

En algunos sistemas, el nombre de host se establece en el entorno. Si ese es su caso, el módulo os 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 indica 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 respondí inicialmente a esto estaba usando esta solución, ya que fue 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, dejo esta respuesta como 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 su programa funcione, use una de las otras soluciones proporcionadas.

 4
Author: GreenMatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-15 14:32:03

Desde al menos python >= 3.3:

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

os.uname().nodename

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

 3
Author: Shubham Chaudhary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-02 12:01:00

Necesitaba el nombre del PC para usar en mi archivo de configuración de PyLog, y la biblioteca de sockets 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 ninguno

 -2
Author: Bill Kidd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-29 19:44:27