¿Obteniendo el nombre de la computadora con Windows que ejecuta el script Python?

94

Básicamente, tengo un par de computadoras con Windows en mi red que ejecutarán un script de Python. Se debe utilizar un conjunto diferente de opciones de configuración en la secuencia de comandos según el equipo que ejecute esta secuencia de comandos.

¿Cómo obtendría ese nombre de computadora en el script de Python?

Digamos que el script se estaba ejecutando en una computadora llamada DARK-TOWER, me gustaría escribir algo como esto:

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

¿Existe una biblioteca estándar o de terceros que pueda usar?

Eric Palakovich Carr
fuente

Respuestas:

160

Resulta que hay tres opciones (incluidas las dos ya respondidas anteriormente):

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME']
'DARK-TOWER'
Eric Palakovich Carr
fuente
16
Responder a la propia pregunta puede ser considerado de mal gusto por algunos, pero está perfectamente bien, según las preguntas frecuentes: stackoverflow.com/faq
Stephan202
9
No creo que sea nada malo, ya que Eric estaba compilando algunas respuestas diferentes en un solo recurso, sin mencionar la adición de una nueva (plataforma).
nilamo
4
ok, entonces esto pide un seguimiento: ¿cuál es la diferencia entre platform.node () y socket.gethostname ()? ¿Pueden alguna vez ser diferentes?
Jason S
4
En los sistemas posix, socket.gethostname()devuelve la libc gethostname(), mientras que platform.node()devuelve, platform.uname()[1]que está algo relacionado con os.uname()las llamadas a la libc uname()... Parece que podrían terminar en el mismo lugar, pero toman caminos bastante diferentes para llegar allí y no estaría confiando en el valor de ser el mismo en diferentes plataformas.
Peter Gibson
5
Vale la pena señalar que os.environ['COMPUTERNAME']devolverá todo en mayúsculas, mientras que platform.node()y socket.gethostname()puede devolver mayúsculas y minúsculas.
MrNoob
33
import socket
socket.gethostname()
brettkelly
fuente
1
+1 porque esta es la mejor manera de hacerlo. Es la llamada multiplataforma más eficaz.
joshin4colours
20

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

import os
os.getenv('COMPUTERNAME')
oneporter
fuente
5
Esto no me funciona en OS-X 10.6.8 usando Python 2.7.2, devuelve Ninguno. Sin embargo, los otros métodos descritos funcionan.
Peter Gibson
2
@PeterGibson Me ocurrió lo mismo en Ubuntu 12.04.
Daniel F
Vuelve Nonepara mí en Ubuntu 16.04. Curiosamente, HOSTNAMEes una variable de entorno definida en bash, pero ambos os.getenv('HOSTNAME')devuelve Nonetambién, mientras que socket.gethostname()devuelve la cadena correcta.
Matt Hancock
12

Como dijo Eric Palakovich Carr, podrías usar estas tres variantes.

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

Lo prefiero cuando desarrollo aplicaciones de plataforma cruzada para estar seguro;)

Faminador
fuente
1
Solo un poco más limpio: if n1 == n2 o n2 == n3: return n1 elif n2 == n3: return n2 else: raise Exception ("Los nombres de las computadoras no son iguales entre sí")
Charles Plager
2
@CharlesPlager Debería 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")(en n1lugar de n2)
dexteritas
@dexteritas: Tienes razón. (No me deja editarlo por cualquier motivo).
Charles Plager
6

Dado que las secuencias de comandos de Python se ejecutan con seguridad en un sistema Windows, debe usar la API Win32 GetComputerName o GetComputerNameEx

Puede obtener el nombre DNS completo, el nombre NETBIOS o una variedad de cosas diferentes.

import win32api
win32api.GetComputerName()

>>'MYNAME'

O:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'
Brian R. Bondy
fuente
0
import socket
pc = socket.gethostname()
print pc
Pedro Muniz
fuente
6
Por favor agregue siempre alguna explicación a la respuesta.
DaFois
Además, esta respuesta es solo una copia de otra respuesta altamente votada de 10 años .
wovano