J'écris un programme de chat pour un réseau local. Je voudrais pouvoir identifier des ordinateurs et obtenir le nom d'ordinateur défini par l'utilisateur avec Python.
Utilisez socket
et sa fonctionnalité gethostname()
. Cela obtiendra le hostname
de l'ordinateur sur lequel l'interpréteur Python est en cours d'exécution:
import socket
print(socket.gethostname())
Les deux sont assez portables:
import platform
platform.node()
import socket
socket.gethostname()
Les solutions utilisant les variables d'environnement Host
ou HOSTNAME
ne sont pas portables. Même si cela fonctionne sur votre système lorsque vous l'exécutez, il peut ne pas fonctionner s'il est exécuté dans des environnements spéciaux tels que cron.
Vous allez probablement charger le module os de toute façon, donc une autre suggestion serait:
import os
myhost = os.uname()[1]
Qu'en est-il de :
import platform
h = platform.uname()[1]
En fait, vous voudrez peut-être consulter tous les résultats dans platform.uname()
os.getenv('HOSTNAME')
et os.environ['HOSTNAME']
ne fonctionnent 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 renvoie toujours (même sous Windows) un nom d'hôte qualifié complet, même si vous avez défini un alias court dans / etc/hosts.
Si vous avez défini un alias dans / etc/hosts alors socket.gethostname()
renverra 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.
Si je ne me trompe pas, vous recherchez la fonction socket.gethostname:
>> import socket
>> socket.gethostname()
'terminus'
socket.gethostname()
pourrait faire
De au moins python> = 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()
Sur certains systèmes, le nom d'hôte est défini dans l'environnement. Si tel est le cas pour vous, le module os 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 pense qu'au moment où j'ai initialement répondu à cette question, j'utilisais cette solution, car c'était la première chose que j'avais trouvée dans une recherche sur le Web et cela fonctionnait pour moi à ce moment-là. En raison du manque de portabilité, je n'utiliserais probablement pas cela maintenant. Cependant, je laisse cette réponse pour référence. FWIW, cela élimine le besoin d’importer d’autres importations si votre environnement porte 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 votre programme devrait fonctionner, utilisez l'une des autres solutions fournies.
Vous devez exécuter cette ligne de code
sock_name = socket.gethostname()
Et ensuite, vous pouvez utiliser le nom pour trouver l'adresse:
print(socket.gethostbyname(sock_name))
J'avais besoin du nom du PC à utiliser dans mon fichier de configuration PyLog, et la bibliothèque de 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 empêchant le renvoi de None