Uzyskujesz nazwę komputera z systemem Windows, na którym działa skrypt w języku Python?

99

Zasadniczo mam kilka komputerów z systemem Windows w mojej sieci, na których będzie działać skrypt w języku Python. W skrypcie należy użyć innego zestawu opcji konfiguracyjnych w zależności od tego, na którym komputerze jest uruchamiany skrypt.

Jak uzyskać nazwę komputera w skrypcie Pythona?

Powiedzmy, że skrypt był uruchomiony na komputerze o nazwie DARK-TOWER, chciałbym napisać coś takiego:

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

Czy istnieje biblioteka standardowa lub innej firmy, z której mogę skorzystać?

Eric Palakovich Carr
źródło

Odpowiedzi:

163

Okazuje się, że są trzy opcje (w tym dwie, na które udzielono już wcześniej odpowiedzi):

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME']
'DARK-TOWER'
Eric Palakovich Carr
źródło
16
Odpowiedź na własne pytanie może być przez niektórych uznana za kiepską, ale jest w porządku, zgodnie z FAQ: stackoverflow.com/faq
Stephan202
9
Nie sądzę, żeby to było złe, ponieważ Eric kompilował kilka różnych odpowiedzi w jeden zasób, nie wspominając o dodaniu nowego (platformy).
nilamo
4
ok, więc woła o kontynuację: jaka jest różnica między platform.node () i socket.gethostname ()? czy kiedykolwiek mogą być inne?
Jason S
4
W systemach POSIX socket.gethostname()zwraca libc gethostname(), podczas gdy platform.node()zwroty, platform.uname()[1]które są w pewnym stopniu związane z os.uname()tym, z którymi wywołuje libc uname()... Wygląda na to, że mogą skończyć się w tym samym miejscu, ale podążają zupełnie innymi ścieżkami, aby się tam dostać i nie mógłbym polegać aby wartość była taka sama na różnych platformach.
Peter Gibson
5
Warto zauważyć, że os.environ['COMPUTERNAME']zwróci wszystkie wielkie litery, podczas gdy platform.node()i socket.gethostname()może zwrócić mieszaną wielkość liter.
MrNoob,
35
import socket
socket.gethostname()
brettkelly
źródło
1
+1 za to, że jest to najlepsza droga. To najskuteczniejsze połączenie między platformami.
joshin4colours
20

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

import os
os.getenv('COMPUTERNAME')
oneporter
źródło
5
To nie działa dla mnie na OS-X 10.6.8 przy użyciu Pythona 2.7.2, zwraca None. Jednak inne opisane metody działają.
Peter Gibson
2
@PeterGibson Miałem to samo, co przydarzyło mi się na Ubuntu 12.04.
Daniel F
Wraca Nonedla mnie na Ubuntu 16.04. Co ciekawe, HOSTNAMEjest zmienną środowiskową zdefiniowaną w bash, ale obie os.getenv('HOSTNAME')zwracają Nonerównież, podczas gdy socket.gethostname()zwracają poprawny ciąg.
Matt Hancock
12

Jak powiedział Eric Palakovich Carr, możesz użyć tych trzech wariantów.

Wolę używać ich razem:

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

Wolę to przy tworzeniu aplikacji cross-patform dla pewności;)

Faminator
źródło
1
Trochę czystsze: jeśli n1 == n2 lub n2 == n3: return n1 elif n2 == n3: return n2 else: raise Wyjątek ("Nazwy komputerów nie są sobie równe")
Charles Plager
2
@CharlesPlager Powinno być: if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")( n1zamiast n2)
dexteritas
@dexteritas: Masz rację. (Z jakiegoś powodu nie pozwala mi go edytować).
Charles Plager,
6

Ponieważ skrypty Pythona z pewnością działają w systemie Windows, należy użyć interfejsu API Win32 GetComputerName lub GetComputerNameEx

Możesz uzyskać w pełni kwalifikowaną nazwę DNS lub nazwę NETBIOS lub wiele różnych rzeczy.

import win32api
win32api.GetComputerName()

>>'MYNAME'

Lub:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'
Brian R. Bondy
źródło
3

Założę się, że gethostname będzie działać pięknie.

Promuj
źródło
0
import socket
pc = socket.gethostname()
print pc
Pedro Muniz
źródło
6
Proszę zawsze dodawać wyjaśnienie do odpowiedzi.
DaFois
1
Poza tym ta odpowiedź jest tylko kopią innej, wysoko ocenianej odpowiedzi 10-latka .
wovano