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?

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'

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


20

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


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'


0
import socket
pc = socket.gethostname()
print pc

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.