Как я могу использовать Python, чтобы получить системное имя хоста? - PullRequest
589 голосов
/ 25 ноября 2010

Я пишу программу чата для локальной сети.Я хотел бы иметь возможность идентифицировать компьютеры и получить заданное пользователем имя компьютера с помощью Python.

Ответы [ 11 ]

909 голосов
/ 25 ноября 2010

Используйте socket и его gethostname() функциональность.Это получит hostname компьютера, на котором работает интерпретатор Python:

import socket
print(socket.gethostname())
345 голосов
/ 25 ноября 2010

Оба они довольно портативны:

import platform
platform.node()

import socket
socket.gethostname()

Любые решения, использующие переменные окружения HOST или HOSTNAME, не являются переносимыми. Даже если он работает в вашей системе при запуске, он может не работать при работе в особых средах, таких как cron.

96 голосов
/ 13 марта 2013

Вы, вероятно, все равно загрузите модуль os, поэтому другое предложение будет:

import os
myhost = os.uname()[1]
56 голосов
/ 08 мая 2012

os.getenv('HOSTNAME') и os.environ['HOSTNAME'] не всегда работают.В заданиях cron и WSDL HTTP HOSTNAME не установлен.Используйте вместо этого:

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

Всегда (даже в Windows) возвращается полное имя хоста, даже если вы определили короткий псевдоним в / etc / hosts .

Если вы определили псевдоним в / etc / hosts , тогда socket.gethostname() вернет псевдоним.platform.uname()[1] делает то же самое.

Я столкнулся с случаем, когда вышеописанное не сработало.Вот что я сейчас использую:

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

Сначала он вызывает gethostname, чтобы посмотреть, возвращает ли он что-то, похожее на имя хоста, если нет, то использует мое оригинальное решение.

55 голосов
/ 02 января 2012

А как же:

import platform

h = platform.uname()[1]

На самом деле вы можете посмотреть на все результаты в platform.uname()

16 голосов
/ 25 ноября 2010

Если я прав, вы ищете функцию socket.gethostname:

>> import socket
>> socket.gethostname()
'terminus'
11 голосов
/ 25 ноября 2010

socket.gethostname() может сделать

7 голосов
/ 02 апреля 2018

Как минимум python> = 3.3 :

Вы можете использовать поле nodename и избегать индексации массива:

os.uname().nodename

Хотя даже документация os.uname предлагает использовать socket.gethostname()

3 голосов
/ 25 ноября 2010

В некоторых системах имя хоста задается в среде. Если это так, то модуль os может вытащить его из среды через os.getenv . Например, если HOSTNAME является переменной окружения, содержащей то, что вы хотите, то получите следующее:

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

Обновление: как отмечено в комментариях, это не всегда работает, так как не все настроены таким образом. Я считаю, что в то время, когда я первоначально отвечал на это, я использовал это решение, так как это было первое, что я нашел в веб-поиске, и оно работало для меня в то время. Из-за отсутствия мобильности я бы, наверное, не использовал это сейчас. Однако я оставляю этот ответ для справочных целей. FWIW, он устраняет необходимость в других операциях импорта, если ваша среда имеет системное имя и вы уже импортируете модуль os. Протестируйте его - если он не работает во всех средах, в которых вы ожидаете, что ваша программа будет работать, используйте одно из предоставленных решений.

1 голос
/ 09 июня 2015

Мне нужно было имя компьютера для использования в моем файле конфигурации PyLog, и библиотека сокетов недоступна, но библиотека os есть.

Для Windows Я использовал:

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

Где defaultValue - строка для предотвращения возврата None

...