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ć?

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'

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,


20

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


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'


0
import socket
pc = socket.gethostname()
print pc

6
Proszę zawsze dodawać wyjaśnienie do odpowiedzi.
DaFois

1
Poza tym ta odpowiedź jest tylko kopią innej, wysoko ocenianej odpowiedzi 10-latka .
wovano
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.