Получение имени компьютера Windows, на котором запущен скрипт Python?

98

По сути, у меня в сети есть пара компьютеров с Windows, на которых будет запущен скрипт Python. В сценарии следует использовать другой набор параметров конфигурации в зависимости от того, на каком компьютере выполняется этот сценарий.

Как мне получить это имя компьютера в скрипте Python?

Допустим, скрипт запущен на компьютере с именем DARK-TOWER, я бы хотел написать что-то вроде этого:

>>> python.library.get_computer_name()
'DARK-TOWER'

Могу ли я использовать стандартную или стороннюю библиотеку?

Эрик Палакович Карр
источник

Ответы:

163

Оказывается, есть три варианта (включая два, на которые уже ответили ранее):

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME']
'DARK-TOWER'
Эрик Палакович Карр
источник
16
Некоторые могут посчитать ответ на собственный вопрос
дурным тоном
9
Я не думаю, что это плохо, так как Эрик собирал несколько разных ответов в один ресурс, не говоря уже о добавлении нового (платформы).
nilamo
4
Хорошо, это требует продолжения: в чем разница между platform.node () и socket.gethostname ()? могут ли они когда-нибудь быть разными?
Jason S
4
В системах posix socket.gethostname()возвращает libc gethostname(), а platform.node()возвращает, platform.uname()[1]что в некоторой степени связано с тем, os.uname()что вызывает libc uname()... Похоже, они могут оказаться в одном и том же месте, но они идут совершенно разными путями, и я бы не стал полагаться значение должно быть одинаковым для разных платформ.
Питер Гибсон
5
Стоит отметить, что os.environ['COMPUTERNAME']будут возвращены все заглавные буквы, тогда как platform.node()и socket.gethostname()можно вернуть смешанный регистр.
MrNoob
34
import socket
socket.gethostname()
Brettkelly
источник
1
+1 за то, что это лучший способ. Это наиболее эффективный кроссплатформенный звонок.
joshin4colours
20

Из https://mail.python.org/pipermail/python-list/2006-April/397494.html

import os
os.getenv('COMPUTERNAME')
Oneporter
источник
5
Это не работает для меня в OS-X 10.6.8 с использованием Python 2.7.2, он возвращает None. Однако другие описанные методы работают.
Питер Гибсон
2
@PeterGibson У меня было то же самое, что и на Ubuntu 12.04.
Daniel F
Возврат Noneдля меня на Ubuntu 16.04. Интересно, HOSTNAMEчто это определенная переменная среды в bash, но обе они также os.getenv('HOSTNAME')возвращают None, а socket.gethostname()возвращают правильную строку.
Мэтт Хэнкок,
12

Как сказал Эрик Палакович Карр, вы можете использовать эти три варианта.

Я предпочитаю использовать их вместе:

def getpcname():
    n1 = platform.node()
    n2 = socket.gethostname()
    n3 = os.environ["COMPUTERNAME"]
    if n1 == n2 == n3:
        return n1
    elif n1 == n2:
        return n1
    elif n1 == n3:
        return n1
    elif n2 == n3:
        return n2
    else:
        raise Exception("Computernames are not equal to each other")

Я предпочитаю это при разработке приложений с перекрестными формами, чтобы быть уверенным;)

Faminator
источник
1
Просто немного чище: если n1 == n2 или n2 == n3: вернуть n1 elif n2 == n3: вернуть n2 else: поднять исключение («Имена компьютеров не равны друг другу»)
Чарльз Плагер,
2
@CharlesPlager Должно быть: if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")( n1вместо n2)
dexteritas
@dexteritas: Вы правы. (Это не позволяет мне редактировать его по какой-либо причине).
Чарльз Плагер
6

Поскольку сценарии python наверняка работают в системе Windows, вам следует использовать Win32 API GetComputerName или GetComputerNameEx.

Вы можете получить полное DNS-имя, или имя NETBIOS, или множество других вещей.

import win32api
win32api.GetComputerName()

>>'MYNAME'

Или:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'
Брайан Р. Бонди
источник
0
import socket
pc = socket.gethostname()
print pc
Педро Мунис
источник
6
Пожалуйста, всегда добавляйте пояснения к ответу.
DaFois
1
Кроме того, этот ответ является копией другого ответа 10-летней давности, получившего большое количество голосов .
wovano