Ответы:
Использование socket
и его gethostname()
функциональность. Это получит hostname
компьютер, на котором работает интерпретатор Python:
import socket
print(socket.gethostname())
socket.getfqdn()
Оба они довольно портативны:
import platform
platform.node()
import socket
socket.gethostname()
Любые решения, использующие переменные 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, поэтому другим предложением будет:
import os
myhost = os.uname()[1]
os
модуля. Не портативный и не очень точный, но в любом случае удобный.
platform.uname()[1]
, который работает на Windows.
Что о :
import platform
h = platform.uname()[1]
На самом деле вы можете посмотреть на все результаты в platform.uname()
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, чтобы увидеть, возвращает ли он что-то, похожее на имя хоста, если нет, то использует мое оригинальное решение.
socket.getfqdn()
, хотя это не то, что просит ОП
Если я прав, вы ищете функцию socket.gethostname:
>> import socket
>> socket.gethostname()
'terminus'
По крайней мере, Python> = 3.3 :
Вы можете использовать поле nodename
и избегать индексации массива:
os.uname().nodename
Хотя даже документация os.uname предлагает использоватьsocket.gethostname()
В некоторых системах имя хоста задается в среде. Если это так, то модуль os может вытащить его из среды через os.getenv . Например, если HOSTNAME является переменной окружения, содержащей то, что вы хотите, то получите следующее:
import os
system_name = os.getenv('HOSTNAME')
Обновление: как отмечено в комментариях, это не всегда работает, так как не все настроены таким образом. Я полагаю, что в то время, когда я первоначально отвечал на это, я использовал это решение, поскольку это было первое, что я нашел в веб-поиске, и оно работало для меня в то время. Из-за отсутствия мобильности я бы, наверное, не использовал это сейчас. Однако я оставляю этот ответ для справочных целей. FWIW, он устраняет необходимость в других операциях импорта, если ваша среда имеет системное имя и вы уже импортируете модуль os. Проверьте это - если он не работает во всех средах, в которых вы ожидаете, что ваша программа будет работать, используйте одно из других предоставленных решений.
Мне нужно было имя ПК для использования в моем файле конфигурации PyLog, и библиотека сокетов не доступна, но библиотека ОС есть.
Для Windows я использовал:
os.getenv('COMPUTERNAME', 'defaultValue')
Где defaultValue - строка, чтобы предотвратить возвращение None
Вы должны выполнить эту строку кода
sock_name = socket.gethostname()
И тогда вы можете использовать имя, чтобы найти адрес:
print(socket.gethostbyname(sock_name))