Отримання назви комп'ютера з Windows, на якому запущений сценарій python?


94

В основному, в моїй мережі є кілька комп’ютерів Windows, на яких буде запущено сценарій python. У сценарії слід використовувати інший набір параметрів конфігурації, залежно від того, на якому комп’ютері працює цей сценарій.

Як отримати це ім'я комп'ютера в сценарії python?

Скажімо, сценарій працював на комп’ютері з назвою DARK-TOWER, я хотів би написати щось подібне:

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

Чи існує стандартна або стороння бібліотека, якою я можу користуватися?

Відповіді:


160

Виявляється, є три варіанти (включаючи два, на які вже відповідали раніше):

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

16
Відповідаючи на один власний питання можна вважати поганий смак деяких, але це прекрасно, так як на найбільш поширені питання: stackoverflow.com/faq
Stephan202

9
Я не думаю, що це зовсім погано, оскільки Ерік збирав кілька різних відповідей в один ресурс, не кажучи вже про додавання нового (платформи).
ніламо,

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

33
import socket
socket.gethostname()

1
+1, оскільки це найкращий спосіб піти. Це найефективніший міжплатформенний дзвінок.
joshin4colours

20

5
Це не працює для мене в OS-X 10.6.8 з використанням Python 2.7.2, він повертає None. Однак інші описані методи працюють.
Пітер Гібсон,

2
@PeterGibson У мене трапилось те саме, що траплялося зі мною в Ubuntu 12.04.
Даніель Ф,

Повертає 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")

Я вважаю за краще це при розробці додатків для крос-шаблонів;)


1
Просто трохи чистіше: якщо n1 == n2 або n2 == n3: return n1 elif n2 == n3: return n2 else: raise Exception ("Імена комп'ютерів не рівні між собою")
Чарльз Плагер

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, слід використовувати API Win32 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

Крім того, ця відповідь - це лише копія 10-річної високо оціненої іншої відповіді .
wovano
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.