Antworten:
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:
import platform
platform.node()
import socket
socket.gethostname()
Lösungen, die die Umgebungsvariablen HOST
oder verwenden HOSTNAME
, 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.
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:
import os
myhost = os.uname()[1]
os
Modul. Nicht tragbar und nicht wirklich genau, aber trotzdem praktisch.
platform.uname()[1]
, was unter Windows funktioniert.
Wie wäre es mit :
import platform
h = platform.uname()[1]
Eigentlich möchten Sie vielleicht einen Blick auf das gesamte Ergebnis in werfen platform.uname()
os.getenv('HOSTNAME')
und os.environ['HOSTNAME']
nicht immer arbeiten. In Cron-Jobs und WSDL ist HTTP HOSTNAME nicht festgelegt. Verwenden Sie stattdessen Folgendes:
import socket
socket.gethostbyaddr(socket.gethostname())[0]
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:
import socket
if socket.gethostname().find('.')>=0:
name=socket.gethostname()
else:
name=socket.gethostbyaddr(socket.gethostname())[0]
Zuerst wird gethostname aufgerufen, um festzustellen, ob etwas zurückgegeben wird, das wie ein Hostname aussieht. Andernfalls wird meine ursprüngliche Lösung verwendet.
socket.getfqdn()
, obwohl es nicht das ist, was das OP verlangt
Ab mindestens Python> = 3.3 :
Sie können das Feld verwenden nodename
und die Array-Indizierung vermeiden:
os.uname().nodename
Selbst in der Dokumentation von os.uname wird die Verwendung vorgeschlagensocket.gethostname()
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:
import os
system_name = os.getenv('HOSTNAME')
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.
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:
os.getenv('COMPUTERNAME', 'defaultValue')
Dabei ist defaultValue eine Zeichenfolge, um zu verhindern, dass None zurückgegeben wird
Sie müssen diese Codezeile ausführen
sock_name = socket.gethostname()
Und dann können Sie den Namen verwenden, um die Adresse zu finden:
print(socket.gethostbyname(sock_name))