¿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.
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())
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.
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]
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.
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()
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'
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
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.
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()
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
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