Jawaban:
Gunakan socket
dan gethostname()
fungsinya. Ini akan menghasilkan hostname
komputer tempat interpreter Python berjalan:
import socket
print(socket.gethostname())
socket.getfqdn()
Keduanya sangat portabel:
import platform
platform.node()
import socket
socket.gethostname()
Solusi apa pun yang menggunakan variabel HOST
atau HOSTNAME
lingkungan tidak portabel. Bahkan jika itu bekerja pada sistem Anda ketika Anda menjalankannya, itu mungkin tidak berfungsi ketika dijalankan di lingkungan khusus seperti 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]
harus lintas-platform dan mendukung variabel lingkungan jika ada - yang memungkinkan beberapa kontrol pengguna dalam keadaan darurat, misalnyaHOSTNAME=correct python xyz.py
Anda mungkin akan memuat modul os, jadi saran lain adalah:
import os
myhost = os.uname()[1]
os
modul. Tidak portabel dan tidak terlalu akurat, tapi tetap berguna.
platform.uname()[1]
, yang TIDAK bekerja pada Windows.
Bagaimana dengan :
import platform
h = platform.uname()[1]
Sebenarnya Anda mungkin ingin melihat semua hasilnya platform.uname()
os.getenv('HOSTNAME')
dan os.environ['HOSTNAME']
tidak selalu berhasil. Dalam pekerjaan cron dan WSDL, HTTP HOSTNAME tidak disetel. Gunakan ini sebagai gantinya:
import socket
socket.gethostbyaddr(socket.gethostname())[0]
Selalu (bahkan di Windows) mengembalikan nama host yang sepenuhnya memenuhi syarat, bahkan jika Anda mendefinisikan alias pendek di / etc / hosts .
Jika Anda mendefinisikan alias di / etc / hosts maka socket.gethostname()
akan mengembalikan alias. platform.uname()[1]
melakukan hal yang sama.
Saya menemukan sebuah kasus di mana hal di atas tidak berhasil. Inilah yang saya gunakan sekarang:
import socket
if socket.gethostname().find('.')>=0:
name=socket.gethostname()
else:
name=socket.gethostbyaddr(socket.gethostname())[0]
Pertama-tama panggilan gethostname untuk melihat apakah ia mengembalikan sesuatu yang terlihat seperti nama host, jika tidak menggunakan solusi asli saya.
socket.getfqdn()
, meskipun itu bukan apa yang diminta OP
Dari setidaknya python> = 3.3 :
Anda bisa menggunakan bidang nodename
dan menghindari menggunakan pengindeksan array:
os.uname().nodename
Meskipun, bahkan dokumentasi os.uname menyarankan menggunakansocket.gethostname()
Pada beberapa sistem, nama host diatur di lingkungan. Jika itu yang terjadi pada Anda, modul os dapat menariknya keluar dari lingkungan melalui os.getenv . Misalnya, jika HOSTNAME adalah variabel lingkungan yang berisi apa yang Anda inginkan, berikut ini akan mendapatkannya:
import os
system_name = os.getenv('HOSTNAME')
Pembaruan: Seperti disebutkan dalam komentar, ini tidak selalu berhasil, karena tidak semua lingkungan diatur dengan cara ini. Saya percaya bahwa pada saat saya menjawab ini pada awalnya saya menggunakan solusi ini karena itu adalah hal pertama yang saya temukan dalam pencarian web dan itu bekerja untuk saya pada saat itu. Karena kurangnya portabilitas saya mungkin tidak akan menggunakan ini sekarang. Namun, saya meninggalkan jawaban ini untuk tujuan referensi. FWIW, itu menghilangkan kebutuhan untuk impor lain jika lingkungan Anda memiliki nama sistem dan Anda sudah mengimpor modul os. Uji - jika tidak bekerja di semua lingkungan di mana Anda mengharapkan program Anda untuk beroperasi, gunakan salah satu solusi lain yang disediakan.
Saya membutuhkan nama PC untuk digunakan dalam file conf PyLog saya, dan perpustakaan socket tidak tersedia, tetapi os library.
Untuk Windows saya menggunakan:
os.getenv('COMPUTERNAME', 'defaultValue')
Di mana DefaultValue adalah string untuk mencegah Tidak ada yang dikembalikan
Anda harus mengeksekusi baris kode ini
sock_name = socket.gethostname()
Dan kemudian Anda dapat menggunakan nama untuk menemukan addr:
print(socket.gethostbyname(sock_name))