Ottenere il nome del computer Windows che esegue lo script Python?


94

Fondamentalmente, ho un paio di computer Windows sulla mia rete che eseguiranno uno script Python. Nello script dovrebbe essere utilizzato un diverso insieme di opzioni di configurazione a seconda del computer che esegue lo script.

Come posso ottenere il nome del computer nello script Python?

Supponiamo che lo script fosse in esecuzione su un computer chiamato DARK-TOWER, mi piacerebbe scrivere qualcosa del genere:

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

Esiste una libreria standard o di terze parti che posso utilizzare?

Risposte:


160

Si scopre che ci sono tre opzioni (comprese le due già risposte in precedenza):

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

16
Rispondere alla propria domanda può essere considerato di cattivo gusto da alcuni, ma va benissimo, come da FAQ: stackoverflow.com/faq
Stephan202

9
Non penso sia affatto male, dal momento che Eric stava compilando alcune risposte diverse in una singola risorsa, per non parlare dell'aggiunta di una nuova (piattaforma).
nilamo

4
ok, quindi questo richiede un seguito: qual è la differenza tra platform.node () e socket.gethostname ()? possono mai essere diversi?
Jason S

4
Sui sistemi posix, socket.gethostname()restituisce la libc gethostname(), mentre platform.node()restituisce platform.uname()[1]che è in qualche modo correlata a os.uname()cui chiama la libc uname()... Sembra che potrebbero finire nello stesso posto, ma prendono strade abbastanza diverse per arrivarci e non mi affiderei sul valore per essere lo stesso su piattaforme diverse.
Peter Gibson

5
Vale la pena notare che os.environ['COMPUTERNAME']restituirà tutto maiuscolo, mentre platform.node()e socket.gethostname()può restituire maiuscole e minuscole.
MrNoob

33
import socket
socket.gethostname()

1
+1 perché questo è il modo migliore per andare. È la chiamata multipiattaforma più efficace.
joshin4colours

20

5
Questo non funziona per me su OS-X 10.6.8 utilizzando Python 2.7.2, restituisce Nessuno. Gli altri metodi descritti funzionano comunque.
Peter Gibson

2
@PeterGibson Mi è successa la stessa cosa su Ubuntu 12.04.
Daniel F

Ritorna Noneper me su Ubuntu 16.04. È interessante notare che HOSTNAMEè una variabile di ambiente definita in bash, ma os.getenv('HOSTNAME')restituisce Noneanche entrambi , mentre socket.gethostname()restituisce la stringa corretta.
Matt Hancock

12

Come ha detto Eric Palakovich Carr, potresti usare queste tre varianti.

Preferisco usarli insieme:

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 preferisco quando sviluppo applicazioni cross-patform per essere sicuro;)


1
Solo un po 'più pulito: if n1 == n2 o n2 == n3: return n1 elif n2 == n3: return n2 else: raise Exception ("I nomi dei computer non sono uguali tra loro")
Charles Plager

2
@CharlesPlager Dovrebbe essere: if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")( n1invece di n2)
dexteritas

@dexteritas: hai ragione. (Non mi consente di modificarlo per nessun motivo).
Charles Plager,

6

Poiché gli script python sono sicuramente in esecuzione su un sistema Windows, dovresti usare l'API Win32 GetComputerName o GetComputerNameEx

È possibile ottenere il nome DNS completo o il nome NETBIOS o una varietà di cose diverse.

import win32api
win32api.GetComputerName()

>>'MYNAME'

O:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'


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

6
Per favore aggiungi sempre qualche spiegazione alla risposta.
DaFois

Inoltre, questa risposta è solo una copia di un'altra risposta di 10 anni molto votata .
wovano
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.