Erhalten Sie den Namen des Windows-Computers, auf dem das Python-Skript ausgeführt wird?

93

Grundsätzlich habe ich ein paar Windows-Computer in meinem Netzwerk, auf denen ein Python-Skript ausgeführt wird. Je nachdem, auf welchem ​​Computer dieses Skript ausgeführt wird, sollten im Skript unterschiedliche Konfigurationsoptionen verwendet werden.

Wie würde ich diesen Computernamen im Python-Skript erhalten?

Angenommen, das Skript wurde auf einem Computer namens DARK-TOWER ausgeführt. Ich möchte so etwas schreiben:

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

Gibt es eine Standard- oder Drittanbieter-Bibliothek, die ich verwenden kann?

Eric Palakovich Carr
quelle

Antworten:

159

Es stellt sich heraus, dass es drei Optionen gibt (einschließlich der beiden bereits zuvor beantworteten):

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME']
'DARK-TOWER'
Eric Palakovich Carr
quelle
16
Die Beantwortung der eigenen Frage kann von manchen als geschmacklos angesehen werden, ist jedoch gemäß den häufig gestellten Fragen
Stephan202,
9
Ich denke nicht, dass es überhaupt schlecht ist, da Eric ein paar verschiedene Antworten in einer einzigen Ressource zusammengefasst hat, ganz zu schweigen vom Hinzufügen einer neuen (Plattform).
Nilamo
4
ok, das schreit nach einem Follow-up: Was ist der Unterschied zwischen platform.node () und socket.gethostname ()? können sie jemals anders sein?
Jason S
4
Auf POSIX - Systemen, socket.gethostname()gibt die libc gethostname(), während platform.node()Erträge , platform.uname()[1]die mit etwas verwandt ist os.uname(), um die libc nennt uname()... Es sieht aus wie sie an der gleichen Stelle enden könnte, aber sie nehmen ganz unterschiedliche Wege dorthin zu kommen , und ich würde nicht verlassen auf den Wert, auf verschiedenen Plattformen gleich zu sein.
Peter Gibson
5
Es ist erwähnenswert, dass os.environ['COMPUTERNAME']alle Großbuchstaben zurückgegeben werden, während gemischte Groß- platform.node()und socket.gethostname()Kleinschreibung zurückgegeben werden können.
MrNoob
33
import socket
socket.gethostname()
brettkelly
quelle
1
+1 dafür ist der beste Weg. Es ist der effektivste plattformübergreifende Anruf.
Joshin4colours
20

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

import os
os.getenv('COMPUTERNAME')
oneporter
quelle
5
Dies funktioniert unter OS-X 10.6.8 mit Python 2.7.2 nicht, es wird None zurückgegeben. Die anderen beschriebenen Methoden funktionieren jedoch.
Peter Gibson
2
@PeterGibson Ich hatte das gleiche Problem mit Ubuntu 12.04.
Daniel F
Gibt Nonefür mich unter Ubuntu 16.04 zurück. Interessanterweise HOSTNAMEist eine definierte Umgebungsvariable in der Bash, aber beide os.getenv('HOSTNAME')kehrt Noneauch, während socket.gethostname()kehrt die richtige Zeichenfolge.
Matt Hancock
12

Wie Eric Palakovich Carr sagte, könnten Sie diese drei Varianten verwenden.

Ich benutze sie lieber zusammen:

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

Ich bevorzuge es bei der Entwicklung von Cross-Patform-Anwendungen, um sicher zu sein;)

Faminator
quelle
1
Nur ein bisschen sauberer: wenn n1 == n2 oder n2 == n3: n1 zurückgeben elif n2 == n3: n2 zurückgeben else: Ausnahme auslösen ("Computernamen sind nicht gleich")
Charles Plager
2
@CharlesPlager Es sollte sein: if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")( n1statt n2)
dexteritas
@dexteritas: Du bist richtig. (Ich kann es aus irgendeinem Grund nicht bearbeiten).
Charles Plager
6

Da die Python-Skripte sicher auf einem Windows-System ausgeführt werden, sollten Sie die Win32-API GetComputerName oder GetComputerNameEx verwenden

Sie können den vollständig qualifizierten DNS-Namen oder NETBIOS-Namen oder eine Vielzahl verschiedener Dinge erhalten.

import win32api
win32api.GetComputerName()

>>'MYNAME'

Oder:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'
Brian R. Bondy
quelle
3

Ich wette, gethostname wird wunderbar funktionieren.

Promit
quelle
0
import socket
pc = socket.gethostname()
print pc
Pedro Muniz
quelle
6
Bitte fügen Sie der Antwort immer eine Erklärung hinzu.
DaFois
Außerdem ist diese Antwort nur eine Kopie einer 10 Jahre alten, hoch bewerteten anderen Antwort .
Wovano