J'écris un programme de chat pour un réseau local. J'aimerais pouvoir identifier les ordinateurs et obtenir le nom d'ordinateur défini par l'utilisateur avec Python.
681
Utilisation socket
et ses gethostname()
fonctionnalités. Cela obtiendra l' hostname
ordinateur sur lequel s'exécute l'interpréteur Python:
import socket
print(socket.gethostname())
socket.getfqdn()
Les deux sont assez portables:
Les solutions utilisant les variables d'environnement
HOST
ouHOSTNAME
ne sont pas portables. Même s'il 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.la source
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]
devrait être multiplateforme et prendre en charge les variables d'environnement si elles existent - ce qui permet un certain contrôle de l'utilisateur dans des situations d'urgence, par exempleHOSTNAME=correct python xyz.py
Vous allez probablement charger le module os de toute façon, donc une autre suggestion serait:
la source
os
module. Pas portable et pas vraiment précis, mais pratique quand même.platform.uname()[1]
, qui fonctionne sur Windows.Qu'en est-il de :
En fait, vous voudrez peut-être jeter un œil à tous les résultats
platform.uname()
la source
os.getenv('HOSTNAME')
etos.environ['HOSTNAME']
ne fonctionnent pas toujours. Dans les tâches cron et WSDL, HTTP HOSTNAME n'est pas défini. Utilisez-le à la place:Il retourne toujours (même sous Windows) un nom d'hôte 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é. Voici ce que j'utilise maintenant:
Il appelle d'abord gethostname pour voir s'il renvoie quelque chose qui ressemble à un nom d'hôte, sinon il utilise ma solution d'origine.
la source
socket.getfqdn()
, mais ce n'est pas ce que l'OP demandeSi j'ai raison, vous recherchez la fonction socket.gethostname:
la source
Depuis au moins python> = 3.3 :
Vous pouvez utiliser le champ
nodename
et éviter d'utiliser l'indexation de tableaux:Même si la documentation d' os.uname suggère d'utiliser
socket.gethostname()
la source
socket.gethostname()
pourrait fairela source
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 retirer 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:
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 répondu au départ, j'utilisais cette solution car c'était la première chose que j'avais trouvée dans une recherche sur le Web et cela a fonctionné 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 fonctionnera, utilisez l'une des autres solutions fournies.
la source
J'avais besoin du nom du PC à utiliser dans mon fichier de configuration PyLog, et la bibliothèque de sockets n'est pas disponible, mais la bibliothèque os l'est.
Pour Windows, j'ai utilisé:
Où defaultValue est une chaîne pour empêcher Aucun d'être renvoyé
la source
Vous devez exécuter cette ligne de code
Et puis vous pouvez utiliser le nom pour trouver l'adr:
la source