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

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

508
demandé sur Itay Grudev 2010-11-25 00:33:23

10 réponses

utiliser socket et sa fonctionnalité gethostname() . Cela donnera le hostname de l'ordinateur où L'interpréteur Python est en cours d'exécution:

import socket
print(socket.gethostname())
792
répondu Alex 2015-02-10 23:02:05

ces deux-là sont assez portables:

import platform
platform.node()

import socket
socket.gethostname()

toute solution utilisant les variables d'environnement HOST ou HOSTNAME n'est pas portable. Même si cela fonctionne sur votre système lorsque vous l'exécutez, il peut ne pas fonctionner lors de l'exécuter dans des environnements particuliers comme cron.

303
répondu robert 2010-11-25 01:19:44

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

import os
myhost = os.uname()[1]
86
répondu mike0042 2013-03-13 19:06:15

os.getenv('HOSTNAME') et os.environ['HOSTNAME'] ne fonctionnent pas toujours. Dans cron jobs et WSDL, le nom D'hôte HTTP n'est pas défini. Utilisez ceci à la place:

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

il retourne toujours (même sous Windows) un nom d'hôte entièrement qualifié, même si vous avez défini un pseudonyme court dans /etc/hosts .

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

je suis tombé sur 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.

53
répondu Tom Ekberg 2012-08-06 13:40:18

Ce sujet :

import platform

h = platform.uname()[1]

en fait, vous pouvez avoir un oeil à tous les résultats dans platform.uname()

46
répondu Lucien Hercaud 2012-01-02 11:31:44

si j'ai raison, vous cherchez la prise.fonction gethostname:

>> import socket
>> socket.gethostname()
'terminus'
15
répondu terminus 2010-11-24 21:37:53

socket.gethostname() pourrait faire

10
répondu vpit3833 2010-11-24 21:38:13

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

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'à la au début, j'ai répondu que j'utilisais cette solution car c'était la première chose que j'avais trouvée dans une recherche sur le web et ça marchait pour moi à l'époque. En raison du manque de portabilité, Je ne l'utiliserais probablement pas maintenant. Toutefois, je laisse cette réponse à titre 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, si cela ne fonctionne pas dans tous les environnements dans lesquels vous vous attendez de votre programme d'exploiter, d'utiliser l'une des autres solutions proposées.

4
répondu GreenMatt 2015-12-15 14:32:03

à partir d'au moins python > = 3,3 :

vous pouvez utiliser le champ nodename et éviter d'utiliser l'indexation de tableau:

os.uname().nodename

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

3
répondu Shubham Chaudhary 2018-04-02 12:01:00

j'avais besoin du nom du PC à utiliser dans mon fichier conf de PyLog, et la bibliothèque socket n'est pas disponible, mais la bibliothèque os l'est.

pour Windows j'ai utilisé:

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

où defaultValue est une chaîne pour empêcher Qu'aucune ne soit retournée

-2
répondu Bill Kidd 2016-03-29 19:44:27