Відповіді:
Використання 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))