2009-04-28 4 views
56

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

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

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

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

есть стандартный или третья сторона библиотеки можно использовать?

ответ

104

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

>>> import platform 
>>> import socket 
>>> import os 
>>> platform.node() 
'DARK-TOWER' 
>>> socket.gethostname() 
'DARK-TOWER' 
>>> os.environ['COMPUTERNAME'] 
'DARK-TOWER' 
+11

Ответ на свой вопрос может считаться плохим вкусом, но это совершенно нормально, как в FAQ: http://stackoverflow.com/faq – Stephan202

+7

Я не думаю, что это плохо, поскольку Эрик составлял несколько разные ответы на один ресурс, не говоря уже о добавлении нового (платформы). – nilamo

+3

ОК, поэтому это кричит о продолжении: в чем разница между platform.node() и socket.gethostname()? могут ли они когда-нибудь быть другими? –

2

Держу пари, gethostname будет работать красиво.

+0

Promit из GameDev? Спасибо за ответ :) –

+1

То же самое. Я получил достаточно ответов от SO, которые, как я думал, должны внести свой вклад. – Promit

5

Поскольку питона scrips являются точно работает на системе окон, вы должны использовать Win32 API GetComputerName или GetComputerNameEx

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

import win32api 
win32api.GetComputerName() 

>>'MYNAME' 

Или:

import win32api 
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname) 

>> u'MYNAME' 
11
+3

Спасибо всем за ваши ответы. Все они отлично работают, поэтому я выбрал человека с самым низким рейтингом. –

+3

Это не работает для меня на OS-X 10.6.8 с использованием Python 2.7.2, он возвращает None. Однако другие описанные методы действительно работают. –

+1

@PeterGibson У меня было то же самое, что и у меня на Ubuntu 12.04. –

18
import socket 
socket.gethostname() 
+1

+1 для этого - лучший способ пойти. Это самый эффективный кросс-платформенный вызов. – joshin4colours

4

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

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

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") 

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

+0

Просто немного чище: если n1 == n2 или n2 == n3: возвращение n1 Элиф n2 == n3: возвращение n2 еще: рейз Exception ("Имена компьютеров не равны друг другу") –

+1

@CharlesPlager Он должен быть: 'if n1 == n2 или n1 == n3: return n1 elif n2 == n3: return n2 else: raise Exception (" Имена компьютеров не равны друг другу ")' ('n1' вместо 'n2') – dexteritas

+0

@dexteritas: Вы правы. (Это не позволит мне редактировать его по любой причине). –

Смежные вопросы