파이썬 스크립트를 실행하는 Windows 컴퓨터의 이름을 얻고 있습니까?


97

기본적으로 네트워크에 파이썬 스크립트를 실행할 Windows 컴퓨터가 두 대 있습니다. 이 스크립트를 실행하는 컴퓨터에 따라 다른 구성 옵션 집합을 스크립트에 사용해야합니다.

파이썬 스크립트에서 컴퓨터 이름을 어떻게 얻습니까?

스크립트가 DARK-TOWER라는 컴퓨터에서 실행되고 있다고 가정 해 보겠습니다. 다음과 같이 작성하고 싶습니다.

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

사용할 수있는 표준 또는 타사 라이브러리가 있습니까?

답변:


163

세 가지 옵션이있는 것으로 나타났습니다 (이미 답변 한 두 가지 옵션 포함).

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME']
'DARK-TOWER'

16
자신의 질문에 답하는 것이 일부 사람들에게는 좋지 않은 취향으로 간주 될 수 있지만 FAQ에 따라 완벽하게 괜찮습니다. stackoverflow.com/faq
Stephan202

9
Eric은 새 응답 (플랫폼)을 추가하는 것은 말할 것도없고 몇 가지 다른 응답을 단일 리소스로 컴파일했기 때문에 전혀 나쁘지 않다고 생각합니다.
nilamo

4
좋아요, 그래서 이것은 후속 조치를 위해 외칩니다. platform.node ()와 socket.gethostname ()의 차이점은 무엇입니까? 그들은 다를 수 있습니까?
Jason S

4
POSIX 시스템에서 socket.gethostname()libc의를 반환 gethostname()하면서, platform.node()반환 platform.uname()[1]다소 관련이 os.uname()있는이 libc의 호출 uname()... 그들은 같은 장소에서 끝날 수도처럼 보이는,하지만 거기에 도착하는 것은 매우 다른 경로를 가지고 내가 의존되지 않을 것이다 서로 다른 플랫폼에서 동일한 가치를 제공합니다.
Peter Gibson

5
os.environ['COMPUTERNAME']모두 대문자를 반환하는 반면 platform.node()socket.gethostname()혼합 대소 문자를 반환 할 수 있다는 점에 주목할 필요가 있습니다.
MrNoob

33
import socket
socket.gethostname()

1
이것이 최선의 방법이라는 점에 +1합니다. 가장 효과적인 크로스 플랫폼 호출입니다.
joshin4colours

20

5
이것은 Python 2.7.2를 사용하는 OS-X 10.6.8에서 작동하지 않으며 None을 반환합니다. 그러나 설명 된 다른 방법은 작동합니다.
Peter Gibson

2
@PeterGibson Ubuntu 12.04에서 나에게 동일한 일이 발생했습니다.
Daniel F

NoneUbuntu 16.04에서 나를 위해 반환 합니다. 흥미롭게도 HOSTNAMEbash에서 정의 된 환경 변수이지만 둘 다 os.getenv('HOSTNAME')반환 None하는 동시에 socket.gethostname()올바른 문자열 을 반환합니다.
Matt Hancock

12

Eric Palakovich Carr가 말했듯이이 세 가지 변형을 사용할 수 있습니다.

함께 사용하는 것이 좋습니다.

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

나는 그것을 확실히하기 위해 크로스 patform 애플리케이션을 개발할 때 그것을 선호한다;)


1
그냥 조금 청소기 : 만약 N1 == N2 또는 N2 == N3 : 리턴 N1 ELIF N2 == N3 : 다른 반환 N2 : 인상 예외 ( "컴퓨터 이름은 서로 동일하지 않습니다")
찰스 Plager

2
: 그것은해야 @CharlesPlager if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")( n1대신 n2)
dexteritas

@dexteritas : 맞습니다. (어떤 이유로 든 편집 할 수 없습니다).
Charles Plager

6

파이썬 스크립트는 Windows 시스템에서 확실히 실행되고 있으므로 Win32 API GetComputerName 또는 GetComputerNameEx를 사용해야합니다.

정규화 된 DNS 이름, NETBIOS 이름 또는 다양한 항목을 얻을 수 있습니다.

import win32api
win32api.GetComputerName()

>>'MYNAME'

또는:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.