Obtendo o nome do computador com Windows executando o script python?

94

Basicamente, tenho alguns computadores Windows em minha rede que estarão executando um script Python. Um conjunto diferente de opções de configuração deve ser usado no script, dependendo de qual computador está executando esse script.

Como obteria esse nome de computador no script Python?

Digamos que o script estava sendo executado em um computador chamado DARK-TOWER, eu gostaria de escrever algo assim:

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

Existe uma biblioteca padrão ou de terceiros que posso usar?

Eric Palakovich Carr
fonte

Respostas:

160

Acontece que existem três opções (incluindo as duas já respondidas anteriormente):

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME']
'DARK-TOWER'
Eric Palakovich Carr
fonte
16
Responder à própria pergunta pode ser considerado de mau gosto para alguns, mas é perfeitamente
normal
9
Eu não acho que seja ruim, já que Eric estava compilando algumas respostas diferentes em um único recurso, sem mencionar a adição de um novo (plataforma).
nilamo
4
ok, então isso clama por um acompanhamento: qual é a diferença entre platform.node () e socket.gethostname ()? eles podem ser diferentes?
Jason S
4
Em sistemas posix, socket.gethostname()retorna o libc gethostname(), enquanto platform.node()retorna platform.uname()[1]que está um tanto relacionado ao os.uname()que chama o libc uname()... Parece que eles podem acabar no mesmo lugar, mas eles tomam caminhos bem diferentes para chegar lá e eu não estaria contando sobre o valor ser o mesmo em diferentes plataformas.
Peter Gibson
5
Vale a pena notar que os.environ['COMPUTERNAME']retornará todas as letras maiúsculas, enquanto platform.node()e socket.gethostname()pode retornar letras maiúsculas e minúsculas.
MrNoob
33
import socket
socket.gethostname()
Brettkelly
fonte
1
1 por ser o melhor caminho a seguir. É a chamada de plataforma cruzada mais eficaz.
joshin4colours de
20

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

import os
os.getenv('COMPUTERNAME')
oneporter
fonte
5
Isso não funciona para mim no OS-X 10.6.8 usando Python 2.7.2, ele retorna Nenhum. Os outros métodos descritos funcionam, no entanto.
Peter Gibson
2
@PeterGibson Eu tive a mesma coisa acontecendo comigo no Ubuntu 12.04.
Daniel F
Retorna Nonepara mim no Ubuntu 16.04. Curiosamente, HOSTNAMEé uma variável de ambiente definida em bash, mas ambos os.getenv('HOSTNAME')retornam Nonetambém, enquanto socket.gethostname()retorna a string correta.
Matt Hancock
12

Como Eric Palakovich Carr disse, você poderia usar essas três variantes.

Eu prefiro usá-los juntos:

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

Eu prefiro ao desenvolver aplicativos de cross patform para ter certeza;)

Faminator
fonte
1
Apenas um pouco mais limpo: if n1 == n2 ou n2 == n3: return n1 elif n2 == n3: return n2 else: raise Exception ("Os nomes dos computadores não são iguais entre si")
Charles Plager
2
@CharlesPlager Deve ser: if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")(em n1vez de n2)
dexteritas
@dexteritas: Você está correto. (Não me deixa editá-lo por qualquer motivo).
Charles Plager
6

Como os scripts python estão rodando em um sistema Windows, você deve usar a API Win32 GetComputerName ou GetComputerNameEx

Você pode obter o nome DNS totalmente qualificado ou o nome NETBIOS ou uma variedade de coisas diferentes.

import win32api
win32api.GetComputerName()

>>'MYNAME'

Ou:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'
Brian R. Bondy
fonte
3

Aposto que gethostname funcionará perfeitamente.

Promit
fonte
0
import socket
pc = socket.gethostname()
print pc
Pedro Muniz
fonte
6
Por favor, sempre acrescente alguma explicação à resposta.
DaFois
Além disso, esta resposta é apenas uma cópia de uma outra resposta altamente votada há 10 anos .
wovano