Piszę program do czatu dla sieci lokalnej. Chciałbym móc zidentyfikować komputery i uzyskać nazwę komputera ustawioną przez użytkownika w Pythonie.
681
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:
Wszelkie rozwiązania wykorzystujące zmienne środowiskowe
HOST
lubHOSTNAME
nie są przenośne. Nawet jeśli działa w systemie po uruchomieniu, może nie działać w specjalnych środowiskach, takich jak cron.źródło
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:
źródło
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 :
Właściwie możesz rzucić okiem na cały wynik
platform.uname()
źródło
os.getenv('HOSTNAME')
ios.environ['HOSTNAME']
nie zawsze działają. W zadaniach cron i WSDL nazwa HTTP HOSTNAME nie jest ustawiona. Zamiast tego użyj tego: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:
Najpierw wywołuje gethostname, aby sprawdzić, czy zwraca coś, co wygląda jak nazwa hosta, jeśli nie, używa mojego oryginalnego rozwiązania.
źródło
socket.getfqdn()
, ale nie o to prosi OPJeśli mam rację, szukasz funkcji socket.gethostname:
źródło
Z przynajmniej python> = 3.3 :
Możesz użyć tego pola
nodename
i uniknąć indeksowania tablic:Chociaż nawet dokumentacja os.uname sugeruje użycie
socket.gethostname()
źródło
socket.gethostname()
mógłby zrobićźródło
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:
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ń.
źródło
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:
Gdzie defaultValue to ciąg znaków, który zapobiega zwróceniu wartości None
źródło
Musisz wykonać ten wiersz kodu
A potem możesz użyć nazwy, aby znaleźć adresata:
źródło