Ich schreibe ein Chat-Programm für ein lokales Netzwerk. Ich möchte in der Lage sein, Computer zu identifizieren und den vom Benutzer festgelegten Computernamen mit Python zu erhalten.
679
Verwendung socket
und deren gethostname()
Funktionalität. Dadurch wird hostname
der Computer abgerufen, auf dem der Python-Interpreter ausgeführt wird:
import socket
print(socket.gethostname())
socket.getfqdn()
Beide sind ziemlich portabel:
Lösungen, die die Umgebungsvariablen
HOST
oder verwendenHOSTNAME
, sind nicht portierbar. Selbst wenn es auf Ihrem System funktioniert, wenn Sie es ausführen, funktioniert es möglicherweise nicht, wenn es in speziellen Umgebungen wie cron ausgeführt wird.quelle
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]
sollte plattformübergreifend sein und Umgebungsvariablen unterstützen, falls vorhanden - was eine gewisse Benutzerkontrolle unter schwierigen Umständen ermöglicht, z. B.HOSTNAME=correct python xyz.py
Sie werden das OS-Modul wahrscheinlich trotzdem laden, daher wäre ein weiterer Vorschlag:
quelle
os
Modul. Nicht tragbar und nicht wirklich genau, aber trotzdem praktisch.platform.uname()[1]
, was unter Windows funktioniert.Wie wäre es mit :
Eigentlich möchten Sie vielleicht einen Blick auf das gesamte Ergebnis in werfen
platform.uname()
quelle
os.getenv('HOSTNAME')
undos.environ['HOSTNAME']
nicht immer arbeiten. In Cron-Jobs und WSDL ist HTTP HOSTNAME nicht festgelegt. Verwenden Sie stattdessen Folgendes:Es gibt immer (auch unter Windows) einen vollständig qualifizierten Hostnamen zurück, selbst wenn Sie in / etc / hosts einen kurzen Alias definiert haben .
Wenn Sie einen Alias in definierten / etc / hosts dann
socket.gethostname()
kehrt das Alias.platform.uname()[1]
macht das gleiche.Ich bin auf einen Fall gestoßen, in dem das oben genannte nicht funktioniert hat. Das benutze ich jetzt:
Zuerst wird gethostname aufgerufen, um festzustellen, ob etwas zurückgegeben wird, das wie ein Hostname aussieht. Andernfalls wird meine ursprüngliche Lösung verwendet.
quelle
socket.getfqdn()
, obwohl es nicht das ist, was das OP verlangtWenn ich richtig liege, suchen Sie nach der Funktion socket.gethostname:
quelle
Ab mindestens Python> = 3.3 :
Sie können das Feld verwenden
nodename
und die Array-Indizierung vermeiden:Selbst in der Dokumentation von os.uname wird die Verwendung vorgeschlagen
socket.gethostname()
quelle
socket.gethostname()
tun könntequelle
Auf einigen Systemen wird der Hostname in der Umgebung festgelegt. Wenn dies bei Ihnen der Fall ist, kann das OS- Modul es über os.getenv aus der Umgebung ziehen . Wenn beispielsweise HOSTNAME die Umgebungsvariable ist, die das enthält, was Sie möchten, erhalten Sie Folgendes:
Update: Wie in den Kommentaren erwähnt, funktioniert dies nicht immer, da nicht jede Umgebung auf diese Weise eingerichtet ist. Ich glaube, dass ich zu dem Zeitpunkt, als ich dies zum ersten Mal beantwortete, diese Lösung verwendet habe, da es das erste war, was ich bei einer Websuche gefunden hatte, und es zu dieser Zeit für mich funktioniert hat. Aufgrund der mangelnden Portabilität würde ich dies jetzt wahrscheinlich nicht verwenden. Ich lasse diese Antwort jedoch zu Referenzzwecken. FWIW macht andere Importe überflüssig, wenn Ihre Umgebung den Systemnamen hat und Sie das Betriebssystemmodul bereits importieren. Testen Sie es - wenn es nicht in allen Umgebungen funktioniert, in denen Ihr Programm ausgeführt werden soll, verwenden Sie eine der anderen bereitgestellten Lösungen.
quelle
Ich brauchte den Namen des PCs, um ihn in meiner PyLog-Konfigurationsdatei zu verwenden, und die Socket-Bibliothek ist nicht verfügbar, die OS-Bibliothek jedoch.
Für Windows habe ich verwendet:
Dabei ist defaultValue eine Zeichenfolge, um zu verhindern, dass None zurückgegeben wird
quelle
Sie müssen diese Codezeile ausführen
Und dann können Sie den Namen verwenden, um die Adresse zu finden:
quelle