Estou escrevendo um programa de bate-papo para uma rede local. Gostaria de poder identificar computadores e obter o nome do computador definido pelo usuário com Python.
680
Use socket
e sua gethostname()
funcionalidade. Isso obterá o hostname
computador em que o interpretador Python está sendo executado:
import socket
print(socket.gethostname())
socket.getfqdn()
Ambos são bastante portáteis:
Quaisquer soluções usando as variáveis de ambiente
HOST
ouHOSTNAME
não são portáteis. Mesmo que funcione no seu sistema quando você o executa, pode não funcionar quando executado em ambientes especiais, como cron.fonte
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]
deve ser variáveis multi-plataforma e ambiente de suporte, se eles existem - o que permite algum controle de usuário em circunstâncias que exijam, por exemploHOSTNAME=correct python xyz.py
Você provavelmente carregará o módulo OS de qualquer maneira, então outra sugestão seria:
fonte
os
módulo. Não é portátil e não é realmente preciso, mas é útil de qualquer maneira.platform.uname()[1]
, que funciona no Windows.A respeito :
Na verdade, você pode querer ver todos os resultados em
platform.uname()
fonte
os.getenv('HOSTNAME')
eos.environ['HOSTNAME']
nem sempre funciona. Em tarefas cron e WSDL, HTTP HOSTNAME não está definido. Use isto:Sempre (mesmo no Windows) retorna um nome completo de host, mesmo se você definiu um alias curto em / etc / hosts .
Se você definiu um alias no / etc / hosts ,
socket.gethostname()
retornará o alias.platform.uname()[1]
faz a mesma coisa.Corri para um caso em que o acima não funcionou. Isto é o que estou usando agora:
Primeiro chama gethostname para ver se retorna algo que se parece com um nome de host; caso contrário, ele usa minha solução original.
fonte
socket.getfqdn()
, no entanto, não é o que o OP pedeSe eu estiver correto, você está procurando a função socket.gethostname:
fonte
De pelo menos python> = 3.3 :
Você pode usar o campo
nodename
e evitar o uso de indexação de matriz:Embora até a documentação do os.uname sugira o uso de
socket.gethostname()
fonte
socket.gethostname()
poderia fazerfonte
Em alguns sistemas, o nome do host é definido no ambiente. Se esse é o seu caso, o módulo os pode retirá-lo do ambiente via os.getenv . Por exemplo, se HOSTNAME é a variável de ambiente que contém o que você deseja, o seguinte será obtido:
Atualização: conforme observado nos comentários, isso nem sempre funciona, pois nem todo mundo é configurado dessa maneira. Acredito que, no momento em que respondi inicialmente, estava usando esta solução, pois era a primeira coisa que encontrei em uma pesquisa na web e funcionou para mim na época. Devido à falta de portabilidade, eu provavelmente não usaria isso agora. No entanto, estou deixando esta resposta para fins de referência. FWIW, elimina a necessidade de outras importações se o seu ambiente tiver o nome do sistema e você já estiver importando o módulo os. Teste - se não funcionar em todos os ambientes em que você espera que seu programa funcione, use uma das outras soluções fornecidas.
fonte
Eu precisava do nome do PC para usar no meu arquivo conf PyLog, e a biblioteca de soquetes não está disponível, mas a biblioteca os está.
Para Windows , usei:
Onde defaultValue é uma sequência para impedir que nenhum seja retornado
fonte
Você precisa executar esta linha de código
E então você pode usar o nome para encontrar o endereço:
fonte