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.
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())
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.
vous allez probablement charger le module os de toute façon, donc une autre suggestion serait:
import os
myhost = os.uname()[1]
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.
Ce sujet :
import platform
h = platform.uname()[1]
en fait, vous pouvez avoir un oeil à tous les résultats dans platform.uname()
si j'ai raison, vous cherchez la prise.fonction gethostname:
>> import socket
>> socket.gethostname()
'terminus'
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.
à 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()
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