Obtention du nom de l'ordinateur Windows exécutant le script python?

94

Fondamentalement, j'ai quelques ordinateurs Windows sur mon réseau qui exécuteront un script python. Un ensemble différent d'options de configuration doit être utilisé dans le script en fonction de l'ordinateur qui exécute ce script.

Comment obtenir ce nom d'ordinateur dans le script python?

Disons que le script s'exécutait sur un ordinateur nommé DARK-TOWER, j'aimerais écrire quelque chose comme ceci:

>>> python.library.get_computer_name()
'DARK-TOWER'

Puis-je utiliser une bibliothèque standard ou tierce?

Eric Palakovich Carr
la source

Réponses:

160

Il s'avère qu'il existe trois options (y compris les deux déjà répondues plus tôt):

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME']
'DARK-TOWER'
Eric Palakovich Carr
la source
16
Répondre à sa propre question peut être considéré comme de mauvais goût par certains, mais c'est parfaitement bien, selon la FAQ: stackoverflow.com/faq
Stephan202
9
Je ne pense pas que ce soit mal du tout, car Eric compilait quelques réponses différentes dans une seule ressource, sans parler de l'ajout d'une nouvelle (plateforme).
nilamo
4
ok, alors cela demande un suivi: quelle est la différence entre platform.node () et socket.gethostname ()? peuvent-ils jamais être différents?
Jason S
4
Sur les systèmes posix, socket.gethostname()retourne la libc gethostname(), tandis que platform.node()retourne platform.uname()[1]qui est quelque peu lié à l' os.uname()appel de la libc uname()... sur la valeur d'être la même sur différentes plates-formes.
Peter Gibson
5
Il convient de noter que os.environ['COMPUTERNAME']retournera toutes les majuscules, alors que platform.node()et socket.gethostname()peut renvoyer une casse mixte.
MrNoob le
33
import socket
socket.gethostname()
Brettkelly
la source
1
+1 pour que ce soit la meilleure façon de procéder. C'est l'appel multiplateforme le plus efficace.
joshin4colours
20

De https://mail.python.org/pipermail/python-list/2006-April/397494.html

import os
os.getenv('COMPUTERNAME')
oneporter
la source
5
Cela ne fonctionne pas pour moi sur OS-X 10.6.8 en utilisant Python 2.7.2, il renvoie None. Les autres méthodes décrites fonctionnent cependant.
Peter Gibson
2
@PeterGibson J'ai eu la même chose qui m'est arrivée sur Ubuntu 12.04.
Daniel F
Retourne Nonepour moi sur Ubuntu 16.04. Fait intéressant, HOSTNAMEest une variable d'environnement définie dans bash, mais les deux os.getenv('HOSTNAME')retourne Noneégalement, tandis que socket.gethostname()renvoie la chaîne correcte.
Matt Hancock
12

Comme l'a dit Eric Palakovich Carr, vous pouvez utiliser ces trois variantes.

Je préfère les utiliser ensemble:

def getpcname():
    n1 = platform.node()
    n2 = socket.gethostname()
    n3 = os.environ["COMPUTERNAME"]
    if n1 == n2 == n3:
        return n1
    elif n1 == n2:
        return n1
    elif n1 == n3:
        return n1
    elif n2 == n3:
        return n2
    else:
        raise Exception("Computernames are not equal to each other")

Je le préfère lors du développement d'applications cross-patform pour être sûr;)

Faminator
la source
1
Juste un peu plus propre: si n1 == n2 ou n2 == n3: retourne n1 elif n2 == n3: retourne n2 else: lever Exception ("Les noms d'ordinateurs ne sont pas égaux entre eux")
Charles Plager
2
@CharlesPlager Cela devrait être: if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")( n1au lieu de n2)
dexteritas
@dexteritas: Vous avez raison. (Cela ne me permettra pas de le modifier pour une raison quelconque).
Charles Plager
6

Étant donné que les scripts python fonctionnent à coup sûr sur un système Windows, vous devez utiliser l'API Win32 GetComputerName ou GetComputerNameEx

Vous pouvez obtenir le nom DNS complet, ou le nom NETBIOS, ou une variété de choses différentes.

import win32api
win32api.GetComputerName()

>>'MYNAME'

Ou:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'
Brian R. Bondy
la source
3

Je parie que gethostname fonctionnera à merveille.

Promettre
la source
0
import socket
pc = socket.gethostname()
print pc
Pedro Muniz
la source
6
Veuillez toujours ajouter une explication à la réponse.
DaFois
En outre, cette réponse n'est qu'une copie d'une autre réponse très appréciée de 10 ans .
wovano