Я пишу программу чата для локальной сети. Я хотел бы иметь возможность идентифицировать компьютеры и получить установленное пользователем имя компьютера с помощью Python.
681
Использование socket
и его gethostname()
функциональность. Это получит hostname
компьютер, на котором работает интерпретатор Python:
import socket
print(socket.gethostname())
socket.getfqdn()
Оба они довольно портативны:
Любые решения, использующие переменные
HOST
илиHOSTNAME
переменные среды, не являются переносимыми. Даже если он работает в вашей системе при запуске, он может не работать при работе в особых средах, таких как cron.источник
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]
должно быть кроссплатформенным и поддерживать переменные среды, если они существуют - что позволяет некоторый пользовательский контроль в неотложных обстоятельствах, напримерHOSTNAME=correct python xyz.py
Вы, вероятно, все равно загрузите модуль os, поэтому другим предложением будет:
источник
os
модуля. Не портативный и не очень точный, но в любом случае удобный.platform.uname()[1]
, который работает на Windows.Что о :
На самом деле вы можете посмотреть на все результаты в
platform.uname()
источник
os.getenv('HOSTNAME')
иos.environ['HOSTNAME']
не всегда работает. В заданиях cron и WSDL HTTP HOSTNAME не установлен. Используйте это вместо:Он всегда (даже в Windows) возвращает полное имя хоста, даже если вы определили короткий псевдоним в / etc / hosts .
Если вы определили псевдоним в / etc / hosts, он
socket.gethostname()
вернет псевдоним.platform.uname()[1]
делает то же самое.Я столкнулся с случаем, когда вышеописанное не сработало. Это то, что я использую сейчас:
Сначала он вызывает gethostname, чтобы увидеть, возвращает ли он что-то, похожее на имя хоста, если нет, то использует мое оригинальное решение.
источник
socket.getfqdn()
, хотя это не то, что просит ОПЕсли я прав, вы ищете функцию socket.gethostname:
источник
По крайней мере, Python> = 3.3 :
Вы можете использовать поле
nodename
и избегать индексации массива:Хотя даже документация os.uname предлагает использовать
socket.gethostname()
источник
socket.gethostname()
может сделатьисточник
В некоторых системах имя хоста задается в среде. Если это так, то модуль os может вытащить его из среды через os.getenv . Например, если HOSTNAME является переменной окружения, содержащей то, что вы хотите, то получите следующее:
Обновление: как отмечено в комментариях, это не всегда работает, так как не все настроены таким образом. Я полагаю, что в то время, когда я первоначально отвечал на это, я использовал это решение, поскольку это было первое, что я нашел в веб-поиске, и оно работало для меня в то время. Из-за отсутствия мобильности я бы, наверное, не использовал это сейчас. Однако я оставляю этот ответ для справочных целей. FWIW, он устраняет необходимость в других операциях импорта, если ваша среда имеет системное имя и вы уже импортируете модуль os. Проверьте это - если он не работает во всех средах, в которых вы ожидаете, что ваша программа будет работать, используйте одно из других предоставленных решений.
источник
Мне нужно было имя ПК для использования в моем файле конфигурации PyLog, и библиотека сокетов не доступна, но библиотека ОС есть.
Для Windows я использовал:
Где defaultValue - строка, чтобы предотвратить возвращение None
источник
Вы должны выполнить эту строку кода
И тогда вы можете использовать имя, чтобы найти адрес:
источник