Risposte:
Uso socket
e sua gethostname()
funzionalità. Questo otterrà il hostname
computer su cui è in esecuzione l'interprete Python:
import socket
print(socket.gethostname())
socket.getfqdn()
Entrambi sono abbastanza portatili:
import platform
platform.node()
import socket
socket.gethostname()
Qualsiasi soluzione che utilizza le variabili di ambiente HOST
o HOSTNAME
non è portatile. Anche se funziona sul tuo sistema quando lo esegui, potrebbe non funzionare quando eseguito in ambienti speciali come cron.
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]
dovrebbe essere multipiattaforma e supportare le variabili di ambiente se esistono - il che consente un certo controllo dell'utente in circostanze urgenti, ad esempioHOSTNAME=correct python xyz.py
Probabilmente caricherai comunque il modulo os, quindi un altro suggerimento sarebbe:
import os
myhost = os.uname()[1]
os
modulo. Non portatile e non molto preciso, ma comunque utile.
platform.uname()[1]
, che FUNZIONA su Windows.
Che dire :
import platform
h = platform.uname()[1]
In realtà potresti voler dare un'occhiata a tutti i risultati platform.uname()
os.getenv('HOSTNAME')
e os.environ['HOSTNAME']
non sempre funziona. Nei lavori cron e WSDL, HTTP HOSTNAME non è impostato. Usa questo invece:
import socket
socket.gethostbyaddr(socket.gethostname())[0]
Restituisce sempre (anche su Windows) un nome host completo, anche se è stato definito un breve alias in / etc / hosts .
Se hai definito un alias in / etc / hosts allorasocket.gethostname()
tornerà l'alias. platform.uname()[1]
fa la stessa cosa.
Mi sono imbattuto in un caso in cui quanto sopra non ha funzionato. Questo è quello che sto usando ora:
import socket
if socket.gethostname().find('.')>=0:
name=socket.gethostname()
else:
name=socket.gethostbyaddr(socket.gethostname())[0]
Per prima cosa chiama gethostname per vedere se restituisce qualcosa che assomiglia a un nome host, in caso contrario utilizza la mia soluzione originale.
socket.getfqdn()
, anche se non è quello che chiede l'OP
Da almeno Python> = 3.3 :
È possibile utilizzare il campo nodename
ed evitare di utilizzare l'indicizzazione dell'array:
os.uname().nodename
Sebbene, anche la documentazione di os.uname suggerisce di usaresocket.gethostname()
Su alcuni sistemi, il nome host è impostato nell'ambiente. In tal caso, il modulo os può estrarlo dall'ambiente tramite os.getenv . Ad esempio, se HOSTNAME è la variabile di ambiente che contiene ciò che si desidera, verrà visualizzato quanto segue:
import os
system_name = os.getenv('HOSTNAME')
Aggiornamento: come notato nei commenti, questo non funziona sempre, poiché l'ambiente di tutti non è impostato in questo modo. Credo che al momento in cui ho risposto inizialmente stavo usando questa soluzione poiché era la prima cosa che avevo trovato in una ricerca sul web e funzionava per me in quel momento. A causa della mancanza di portabilità, probabilmente non lo userei ora. Tuttavia, lascio questa risposta a scopo di riferimento. FWIW, elimina la necessità di altre importazioni se il tuo ambiente ha il nome di sistema e stai già importando il modulo os. Provalo - se non funziona in tutti gli ambienti in cui prevedi che il tuo programma funzioni, usa una delle altre soluzioni fornite.
Avevo bisogno del nome del PC da usare nel mio file conf PyLog e la libreria socket non è disponibile, ma la libreria os lo è.
Per Windows ho usato:
os.getenv('COMPUTERNAME', 'defaultValue')
Dove defaultValue è una stringa per impedire la restituzione di None
Devi eseguire questa riga di codice
sock_name = socket.gethostname()
E poi puoi usare il nome per trovare l'add:
print(socket.gethostbyname(sock_name))