Saya sedang menulis program obrolan untuk jaringan lokal. Saya ingin dapat mengidentifikasi komputer dan mendapatkan nama komputer yang diatur pengguna dengan Python.
681
Gunakan socket
dan gethostname()
fungsinya. Ini akan menghasilkan hostname
komputer tempat interpreter Python berjalan:
import socket
print(socket.gethostname())
socket.getfqdn()
Keduanya sangat portabel:
Solusi apa pun yang menggunakan variabel
HOST
atauHOSTNAME
lingkungan tidak portabel. Bahkan jika itu bekerja pada sistem Anda ketika Anda menjalankannya, itu mungkin tidak berfungsi ketika dijalankan di lingkungan khusus seperti cron.sumber
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:
sumber
os
modul. Tidak portabel dan tidak terlalu akurat, tapi tetap berguna.platform.uname()[1]
, yang TIDAK bekerja pada Windows.Bagaimana dengan :
Sebenarnya Anda mungkin ingin melihat semua hasilnya
platform.uname()
sumber
os.getenv('HOSTNAME')
danos.environ['HOSTNAME']
tidak selalu berhasil. Dalam pekerjaan cron dan WSDL, HTTP HOSTNAME tidak disetel. Gunakan ini sebagai gantinya: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:
Pertama-tama panggilan gethostname untuk melihat apakah ia mengembalikan sesuatu yang terlihat seperti nama host, jika tidak menggunakan solusi asli saya.
sumber
socket.getfqdn()
, meskipun itu bukan apa yang diminta OPJika saya benar, Anda mencari fungsi socket.gethostname:
sumber
Dari setidaknya python> = 3.3 :
Anda bisa menggunakan bidang
nodename
dan menghindari menggunakan pengindeksan array:Meskipun, bahkan dokumentasi os.uname menyarankan menggunakan
socket.gethostname()
sumber
socket.gethostname()
bisa melakukansumber
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:
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.
sumber
Saya membutuhkan nama PC untuk digunakan dalam file conf PyLog saya, dan perpustakaan socket tidak tersedia, tetapi os library.
Untuk Windows saya menggunakan:
Di mana DefaultValue adalah string untuk mencegah Tidak ada yang dikembalikan
sumber
Anda harus mengeksekusi baris kode ini
Dan kemudian Anda dapat menggunakan nama untuk menemukan addr:
sumber