Odpowiedzi:
Zastosowanie socket
i jego gethostname()
funkcjonalność. Otrzyma hostname
komputer, na którym działa interpreter Pythona:
import socket
print(socket.gethostname())
socket.getfqdn()
Oba są dość przenośne:
import platform
platform.node()
import socket
socket.gethostname()
Wszelkie rozwiązania wykorzystujące zmienne środowiskowe HOST
lub HOSTNAME
nie są przenośne. Nawet jeśli działa w systemie po uruchomieniu, może nie działać w specjalnych środowiskach, takich jak cron.
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]
powinno być cross-platform i środowisku obsługują zmiennych jeśli istnieją - co pozwala na pewną kontrolę użytkownika w okolicznościach wymagających natychmiastowego przykładHOSTNAME=correct python xyz.py
Prawdopodobnie i tak załadujesz moduł OS, więc inną sugestią byłoby:
import os
myhost = os.uname()[1]
os
moduł. Nie przenośny i niezbyt dokładny, ale i tak przydatny.
platform.uname()[1]
, który DZIAŁA w systemie Windows.
Co powiesz na :
import platform
h = platform.uname()[1]
Właściwie możesz rzucić okiem na cały wynik platform.uname()
os.getenv('HOSTNAME')
i os.environ['HOSTNAME']
nie zawsze działają. W zadaniach cron i WSDL nazwa HTTP HOSTNAME nie jest ustawiona. Zamiast tego użyj tego:
import socket
socket.gethostbyaddr(socket.gethostname())[0]
Zawsze (nawet w systemie Windows) zwraca w pełni kwalifikowaną nazwę hosta, nawet jeśli zdefiniowałeś krótki alias w / etc / hosts .
Jeśli zdefiniowany alias w pliku / etc / hosts następnie socket.gethostname()
powróci alias. platform.uname()[1]
robi to samo.
Natknąłem się na przypadek, w którym powyższe nie zadziałało. Z tego teraz korzystam:
import socket
if socket.gethostname().find('.')>=0:
name=socket.gethostname()
else:
name=socket.gethostbyaddr(socket.gethostname())[0]
Najpierw wywołuje gethostname, aby sprawdzić, czy zwraca coś, co wygląda jak nazwa hosta, jeśli nie, używa mojego oryginalnego rozwiązania.
socket.getfqdn()
, ale nie o to prosi OP
Jeśli mam rację, szukasz funkcji socket.gethostname:
>> import socket
>> socket.gethostname()
'terminus'
Z przynajmniej python> = 3.3 :
Możesz użyć tego pola nodename
i uniknąć indeksowania tablic:
os.uname().nodename
Chociaż nawet dokumentacja os.uname sugeruje użyciesocket.gethostname()
W niektórych systemach nazwa hosta jest ustawiana w środowisku. Jeśli tak jest w twoim przypadku, moduł os może wyciągnąć go ze środowiska przez os.getenv . Na przykład, jeśli NAZWA_HOSTA jest zmienną środowiskową zawierającą to, czego chcesz, następujące:
import os
system_name = os.getenv('HOSTNAME')
Aktualizacja: Jak zauważono w komentarzach, nie zawsze to działa, ponieważ nie wszyscy są skonfigurowani w ten sposób. Wierzę, że w chwili, gdy początkowo na to odpowiadałem, korzystałem z tego rozwiązania, ponieważ była to pierwsza rzecz, którą znalazłem podczas wyszukiwania w sieci i wtedy działało to dla mnie. Z powodu braku przenośności prawdopodobnie nie użyłbym tego teraz. Pozostawiam jednak tę odpowiedź w celach informacyjnych. FWIW, eliminuje potrzebę innych importów, jeśli twoje środowisko ma nazwę systemu i już importujesz moduł os. Przetestuj - jeśli nie działa we wszystkich środowiskach, w których oczekuje się działania programu, skorzystaj z jednego z pozostałych dostarczonych rozwiązań.
Potrzebowałem nazwy komputera, aby użyć jej w moim pliku conf PyLog, a biblioteka gniazd nie jest dostępna, ale biblioteka OS jest.
Do systemu Windows użyłem:
os.getenv('COMPUTERNAME', 'defaultValue')
Gdzie defaultValue to ciąg znaków, który zapobiega zwróceniu wartości None
Musisz wykonać ten wiersz kodu
sock_name = socket.gethostname()
A potem możesz użyć nazwy, aby znaleźć adresata:
print(socket.gethostbyname(sock_name))