파이썬을 사용하여 시스템 호스트 이름을 얻는 방법은 무엇입니까?


681

로컬 네트워크 용 채팅 프로그램을 작성 중입니다. 파이썬으로 컴퓨터를 식별하고 사용자 설정 컴퓨터 이름을 얻을 수 있기를 바랍니다.

답변:


1043

사용 socketgethostname()기능. 이것은 hostname파이썬 인터프리터가 실행되는 컴퓨터를 얻습니다 .

import socket
print(socket.gethostname())

70
글쎄, 그건 정확하지 않다. 오프라인과 가정에서 작동하지만 이제는 사무실이며 다른 호스트 이름을 반환합니다.
DataGreed 2016 년

74
FQDN의 경우 다음을 사용할 수 있습니다.socket.getfqdn()
Dave Forgac

31
@DataGreed는 호스트 이름이 변경 되었기 때문입니다. 파이썬의 문제가 아닙니다.
strickli

4
@DataGreed 1. "임의"가 아니라고 확신합니다. 2. 질문에 "시스템 이름"이 아니라 "시스템 호스트 이름"이 있습니다. 3. 많은 수의 시스템 (확실히 Windows를 포함하지 않음)의 경우 호스트와 시스템 이름이 동일합니다.
strickli

8
socket.gethostname ()과 os.uname () [1] 또는 platform.uname () [1]의
차이점이 궁금합니다

388

이 두 가지 모두 이식성이 뛰어납니다.

import platform
platform.node()

import socket
socket.gethostname()

HOST또는 HOSTNAME환경 변수를 사용하는 솔루션 은 이식성이 없습니다. 시스템을 실행할 때 시스템에서 작동하더라도 cron과 같은 특수 환경에서 실행될 때는 작동하지 않을 수 있습니다.


6
반 휴대용. 일부 플랫폼, platform.node ()는 FQDN를 제공하고 다른 사람 만 호스트 이름
raindog308

3
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
레이더 아래

8
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
레이더 아래

7
@BelowtheRadar는 걱정하지 않습니다. 보통 스크립트 당 한 번만 호출합니다.
robert

6
platform.node ()는 os.getenv보다 빠릅니다. gethostname은 경쟁자도 아닙니다. 그러나 시간이 중요하지 않은 경우 : import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]크로스 플랫폼이어야하고 환경 변수가 존재하는 경우 환경 변수를 지원해야합니다. 예를 들어 긴급 상황에서 일부 사용자 제어가 가능합니다.HOSTNAME=correct python xyz.py
Orwellophile

121

어쨌든 os 모듈을로드 할 것이므로 다른 제안은 다음과 같습니다.

import os
myhost = os.uname()[1]

8
os모듈 을 사용하는 솔루션의 경우 +1 휴대용이 아니며 정확하지는 않지만 어쨌든 편리합니다.
MestreLion

20
os.uname은 Windows에서 지원되지 않습니다. docs.python.org/dev/library/os#os.uname
Noam Manos

9
os.uname (). nodename을 사용하여 3.3+에서 좀 더 명확하게 만들 수 있습니다.
Hut8

4
아래의 답변은 platform.uname()[1]Windows에서 작동 하는 유사한 모양을 제공합니다 .
환상적

6
@fantabolous 착륙하는 동안 답변이 바뀔 수 있으므로 "아래"와 같은 위치 단어를 사용해서는 안됩니다.;)
Jonathan Komar

65

이건 어떤가요 :

import platform

h = platform.uname()[1]

실제로 모든 결과를 살펴보고 싶을 수도 있습니다. platform.uname()


1
우분투와 Windows에서 나를 위해 일했습니다. 감사! 👍
GollyJer

61

os.getenv('HOSTNAME')그리고 os.environ['HOSTNAME']항상 작동하지 않습니다. 크론 작업 및 WSDL에서 HTTP HOSTNAME이 설정되지 않았습니다. 대신 이것을 사용하십시오 :

import socket
socket.gethostbyaddr(socket.gethostname())[0]

/ etc / hosts 에 짧은 별명을 정의한 경우에도 항상 (Windows에서도) 완전한 호스트 이름을 리턴 합니다 .

당신이 별명 정의 된 경우 / 등 / 호스트는 다음 socket.gethostname()별칭을 반환합니다. platform.uname()[1]같은 일을합니다.

위의 방법으로 작동하지 않는 경우가 발생했습니다. 이것이 내가 지금 사용하고있는 것입니다 :

import socket
if socket.gethostname().find('.')>=0:
    name=socket.gethostname()
else:
    name=socket.gethostbyaddr(socket.gethostname())[0]

먼저 gethostname을 호출하여 원래 솔루션을 사용하지 않는 경우 호스트 이름처럼 보이는 것을 반환하는지 확인합니다.


15
socket.getfqdn()OP가 요구하는 것은 아니지만, 아마도 원할 것이다
jfs

17

내가 맞다면 socket.gethostname 함수를 찾고 있습니다.

>> import socket
>> socket.gethostname()
'terminus'



5

일부 시스템에서는 호스트 이름이 환경에서 설정됩니다. 이 경우 os 모듈os.getenv 를 통해 환경에서 모듈 을 꺼낼 수 있습니다 . 예를 들어, HOSTNAME이 원하는 것을 포함하는 환경 변수이면 다음과 같이 얻을 수 있습니다.

import os
system_name = os.getenv('HOSTNAME')

업데이트 : 의견에서 언급했듯이 모든 사람의 환경이 이런 식으로 설정되는 것은 아니기 때문에 항상 작동하는 것은 아닙니다. 나는 내가 처음에 이것에 대답했을 때 나는이 솔루션을 사용하고 있다고 생각했다. 왜냐하면 그것은 웹 검색에서 처음 발견 된 것이었고 당시에는 저에게 효과적이었습니다. 이식성이 부족하기 때문에 아마도 이것을 사용하지 않을 것입니다. 그러나 참조 목적 으로이 답변을 남기고 있습니다. FWIW는 환경에 시스템 이름이 있고 이미 os 모듈을 가져 오는 경우 다른 가져 오기가 필요하지 않습니다. 테스트하십시오-프로그램이 작동 할 것으로 예상되는 모든 환경에서 작동하지 않으면 제공된 다른 솔루션 중 하나를 사용하십시오.


5
그것은 나를 위해 "없음"을 반환합니다. 게시 한 링크에 따르면 변수 'HOSTNAME'이 존재하지 않는다는 것을 의미합니다 ... :-/
John

@ 존 : 당신은 Windows에 있습니까? 그것은 Linux 상자에서 나를 위해 일했지만 Windows에서도 None을 얻습니다.
GreenMatt

@ MuhiNJoroge : 구현 / 설치에 달려 있다고 생각합니다. 그 답을 쓸 때 나는 Red Hat 상자에 있었고 효과가있었습니다. 이제 우분투에 있는데 작동하지 않습니다. 답변을 수정했습니다.
GreenMatt

lenovo NAS에서 작동하지 않으면 None을 반환하십시오. 지금은 수입 소켓 인쇄를 사용하고 있습니다 (socket.gethostname ())
루이 마틴

@ RuiMartins : 내가 말했듯이, 그것은 모든 곳에서 작동하지 않는 것 같습니다. 당신이 작동하는 것을 찾아서 다행입니다.
GreenMatt

5

PyLog conf 파일에서 사용할 PC 이름이 필요했으며 소켓 라이브러리는 사용할 수 없지만 os 라이브러리는 사용할 수 있습니다.

Windows의 경우 다음을 사용했습니다.

os.getenv('COMPUTERNAME', 'defaultValue')

여기서 defaultValue는 None이 반환되지 않도록하는 문자열입니다.


12
COMPUTERNAME은 매우 Microsoft 전용 환경 변수이므로 이식성이 없습니다.
드와이트 스펜서

1
예, 그러나 MS 시스템에서는 작동하며 적합하다면 작동합니다. 실용성과 질문으로 인해 관련성이없는 경우 사람들은 속도 나 플랫폼 독립성에 너무 얽매여 있습니다.
Bill Kidd

7
@BillKidd OP는이 문제에서 Windows, OS X 및 Linux를 언급하므로 시스템 이식성이 필요하다는 것은 매우 합리적인 가정입니다.
zstewart 2016

1
@BillKidd 일반적으로보다 이식성이 뛰어 나기 때문에 쉽게 구할 수 있고 유지 관리가 쉬운 솔루션을 사용하지 말고 조기 최적화 또는 이식성을 피해야한다는 것이 사실입니다.
Mad Physicist

2

이 코드 줄을 실행해야합니다

sock_name = socket.gethostname()

그런 다음 이름을 사용하여 addr을 찾을 수 있습니다.

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