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.
681
Uso socket
y su gethostname()
funcionalidad. Esto obtendrá la hostname
de la computadora donde se ejecuta el intérprete de Python:
import socket
print(socket.gethostname())
socket.getfqdn()
Ambos son bastante portátiles:
Cualquier solución utilizando las
HOST
oHOSTNAME
variables 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.fuente
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
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
Probablemente cargará el módulo os de todos modos, por lo que otra sugerencia sería:
fuente
os
módulo. No es portátil y no es realmente preciso, pero útil de todos modos.platform.uname()[1]
, que funciona en Windows.Qué pasa :
En realidad, es posible que desee ver todos los resultados en
platform.uname()
fuente
os.getenv('HOSTNAME')
yos.environ['HOSTNAME']
no siempre funcionan En trabajos cron y WSDL, HTTP HOSTNAME no está configurado. Use esto en su lugar: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 mismoMe encontré con un caso donde lo anterior no funcionó. Esto es lo que estoy usando ahora:
Primero llama a gethostname para ver si devuelve algo que se parece a un nombre de host, si no, usa mi solución original.
fuente
socket.getfqdn()
, aunque no es lo que pide el OPSi estoy en lo correcto, está buscando la función socket.gethostname:
fuente
Desde al menos python> = 3.3 :
Puede usar el campo
nodename
y evitar usar la indexación de matriz:Aunque, incluso la documentación de os.uname sugiere usar
socket.gethostname()
fuente
socket.gethostname()
podría hacerfuente
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á:
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.
fuente
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é:
Donde defaultValue es una cadena para evitar que se devuelva None
fuente
Tienes que ejecutar esta línea de código
Y luego puedes usar el nombre para encontrar el addr:
fuente