web-dev-qa-db-fra.com

Comment 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 des ordinateurs et obtenir le nom d'ordinateur défini par l'utilisateur avec Python.

603
John

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())
930
Alex

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.

350
robert

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

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

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()

56
Lucien Hercaud

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.

56
Tom Ekberg

Si je ne me trompe pas, vous recherchez la fonction socket.gethostname:

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

socket.gethostname() pourrait faire

11
vpit3833

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()

7

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.

3
GreenMatt

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))
0
Parzifal Kali

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

0
Bill Kidd