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


Answers

Les deux sont assez portables:

import platform
platform.node()

import socket
socket.gethostname()

Toutes 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 lorsqu'il est exécuté dans des environnements spéciaux tels que cron.

Question

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




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 complet, même si vous avez défini un alias court dans / etc / hosts .

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

J'ai couru dans un cas où le ci-dessus 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.




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 sortir de l'environnement via os.getenv . Par exemple, si HOSTNAME est la variable d'environnement contenant ce que vous voulez, voici ce que vous obtiendrez:

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'au moment où j'ai d'abord répondu à cette question, j'utilisais cette solution car c'était la première chose que j'avais trouvé dans une recherche sur le web et cela fonctionnait pour moi à l'époque. En raison du manque de portabilité, je n'utiliserais probablement pas cela maintenant. Cependant, je laisse cette réponse à des fins de référence. FWIW, cela supprime le besoin 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 vous attendez que votre programme fonctionne, utilisez l'une des autres solutions fournies.




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

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



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

Pour Windows j'ai utilisé:

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

Où defaultValue est une chaîne pour empêcher que None ne soit retourné