Question Comment puis-je utiliser Python pour obtenir le nom d'hôte du système?


J'écris un programme de discussion pour un réseau local. Je voudrais pouvoir identifier les ordinateurs et obtenir le nom de l'ordinateur défini par l'utilisateur avec Python.


494
2017-11-24 21:33


origine


Réponses:


Utilisation socket et son gethostname() fonctionnalité. Cela obtiendra le hostname de l'ordinateur sur lequel s'exécute l'interpréteur Python:

import socket
print(socket.gethostname())

773
2017-11-24 21:36



Les deux sont très portables:

import platform
platform.node()

import socket
socket.gethostname()

Toute solution utilisant le HOST ou HOSTNAME les variables d'environnement ne sont pas portables. Même si cela fonctionne sur votre système lorsque vous l'exécutez, il peut ne pas fonctionner lorsqu'il est exécuté dans des environnements spéciaux tels que cron.


292
2017-11-24 21:53



Vous allez probablement charger le module os de toute façon, donc une autre suggestion serait:

import os
myhost = os.uname()[1]

81
2018-03-13 19:06



os.getenv('HOSTNAME') et os.environ['HOSTNAME'] ne fonctionne pas toujours. Dans les tâches cron et WSDL, HTTP HOSTNAME n'est pas défini. Utilisez ceci à la place:

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

Il (toujours sous Windows) renvoie toujours un nom d'hôte qualifié complet, même si vous avez défini un court alias dans / etc / hosts.

Si vous avez défini un alias dans / etc / hosts puis socket.gethostname() retournera l'alias. platform.uname()[1] fait la même chose.

J'ai rencontré un cas où ce qui précède n'a pas fonctionné. C'est ce que j'utilise maintenant:

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

Il appelle d'abord gethostname pour voir s'il renvoie quelque chose qui ressemble à un nom d'hôte, sinon il utilise ma solution originale.


52
2018-05-08 15:23



Qu'en est-il de :

import platform

h = platform.uname()[1]

En fait, vous voudrez peut-être jeter un oeil à tous les résultats platform.uname()


44
2018-01-02 10:14



Si je suis correct, vous cherchez la fonction socket.gethostname:

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

15
2017-11-24 21:37



socket.gethostname() pourrait faire


10
2017-11-24 21:38



Sur certains systèmes, le nom d'hôte est défini dans l'environnement. Si c'est le cas pour vous, le os module peut le sortir de l'environnement via os.getenv. Par exemple, si HOSTNAME est la variable d'environnement contenant ce que vous voulez, les éléments suivants l'obtiendront:

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

Mise à jour: Comme indiqué dans les commentaires, cela ne fonctionne pas toujours, car l'environnement de tout le monde n'est pas configuré de cette façon. Je crois qu'au moment où j'ai d'abord répondu à cette question, j'utilisais cette solution car c'était la première chose que j'avais trouvé dans une recherche sur le web et cela fonctionnait pour moi à l'époque. En raison du manque de portabilité, je ne l'utiliserais probablement pas maintenant. Cependant, je laisse cette réponse à des fins de référence. FWIW, cela élimine le besoin d'autres importations si votre environnement a le nom du système et que vous importez déjà le module os. Testez-le - s'il ne fonctionne pas dans tous les environnements dans lesquels vous prévoyez que votre programme fonctionne, utilisez l'une des autres solutions fournies.


4
2017-11-24 21:43



Du moins python> = 3.3:

Vous pouvez utiliser le champ nodename et évitez d'utiliser l'indexation de tableau:

os.uname().nodename

Bien que, même la documentation de os.uname suggère d'utiliser socket.gethostname()


2
2018-04-02 12:01