Відповіді:
Використання 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()
, хоча це не те, що просить ОП
Принаймні, python> = 3.3 :
Ви можете використовувати поле nodename
та уникати індексації масиву:
os.uname().nodename
Хоча навіть документація на os.uname пропонує використовуватиsocket.gethostname()
У деяких системах ім'я хоста встановлюється в середовищі. Якщо це так для вас, модуль os може витягнути його з оточення через os.getenv . Наприклад, якщо HOSTNAME - це змінна середовище, що містить те, що ви хочете, це отримає наступне:
import os
system_name = os.getenv('HOSTNAME')
Оновлення: Як зазначалося в коментарях, це не завжди спрацьовує, оскільки не всі середовища налаштовані таким чином. Я вважаю, що тоді, коли я спочатку відповідав на це, я використовував це рішення, оскільки це було першим, що я знайшов у веб-пошуку, і він працював для мене на той час. Через відсутність портативності я, мабуть, зараз цим не користувався. Однак я залишаю цю відповідь для довідки. FWIW, він усуває необхідність іншого імпорту, якщо ваше середовище має ім'я системи, а ви вже імпортуєте модуль os. Перевірте це - якщо вона працює не у всіх середовищах, в яких ви очікуєте, що ваша програма працюватиме, використовуйте одне з інших наданих рішень.
Мені потрібно було ім'я ПК для використання в моєму файлі ConfLog PyLog, і бібліотека сокет недоступна, але бібліотека OS є.
Для Windows я використовував:
os.getenv('COMPUTERNAME', 'defaultValue')
Якщо defaultValue - це рядок, щоб запобігти поверненню None
Ви повинні виконати цей рядок коду
sock_name = socket.gethostname()
І тоді ви можете використовувати ім'я, щоб знайти addr:
print(socket.gethostbyname(sock_name))