Mendapatkan nama komputer windows yang menjalankan skrip python?

98

Pada dasarnya, saya memiliki beberapa komputer Windows di jaringan saya yang akan menjalankan skrip python. Serangkaian opsi konfigurasi yang berbeda harus digunakan dalam skrip tergantung pada komputer mana yang menjalankan skrip ini.

Bagaimana saya mendapatkan nama komputer itu di skrip python?

Misalkan skrip dijalankan di komputer bernama DARK-TOWER, saya ingin menulis sesuatu seperti ini:

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

Apakah ada pustaka standar atau pihak ketiga yang dapat saya gunakan?

Eric Palakovich Carr
sumber

Jawaban:

163

Ternyata ada tiga pilihan (termasuk dua yang sudah dijawab tadi):

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME']
'DARK-TOWER'
Eric Palakovich Carr
sumber
16
Menjawab pertanyaan sendiri mungkin dianggap selera yang buruk oleh beberapa orang, tetapi itu baik-baik saja, sesuai FAQ: stackoverflow.com/faq
Stephan202
9
Saya tidak berpikir itu buruk sama sekali, karena Eric mengumpulkan beberapa tanggapan berbeda ke dalam satu sumber daya, belum lagi menambahkan yang baru (platform).
nilamo
4
ok, jadi ini meminta tindak lanjut: apa perbedaan antara platform.node () dan socket.gethostname ()? bisakah mereka berbeda?
Jason S
4
Pada sistem posix, socket.gethostname()kembalikan libc gethostname(), sedangkan platform.node()pengembalian platform.uname()[1]yang agak terkait dengan os.uname()yang memanggil libc uname()... Sepertinya mereka mungkin berakhir di tempat yang sama, tetapi mereka mengambil jalur yang sangat berbeda untuk sampai ke sana dan saya tidak akan mengandalkan pada nilai agar sama di berbagai platform.
Peter Gibson
5
Perlu dicatat bahwa os.environ['COMPUTERNAME']akan mengembalikan semua huruf besar, sedangkan platform.node()dan socket.gethostname()dapat mengembalikan huruf besar / kecil.
MrNoob
34
import socket
socket.gethostname()
brettkelly
sumber
1
1 karena ini adalah cara terbaik untuk pergi. Ini panggilan lintas platform yang paling efektif.
joshin4colours
20

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

import os
os.getenv('COMPUTERNAME')
satu reporter
sumber
5
Ini tidak berfungsi untuk saya di OS-X 10.6.8 menggunakan Python 2.7.2, ia mengembalikan Tidak Ada. Metode lain yang dijelaskan berhasil.
Peter Gibson
2
@PeterGibson Saya mengalami hal yang sama di Ubuntu 12.04.
Daniel F
Kembali Noneuntuk saya di Ubuntu 16.04. Menariknya, HOSTNAMEadalah variabel lingkungan yang ditentukan di bash, tetapi keduanya juga os.getenv('HOSTNAME')mengembalikan None, sambil socket.gethostname()mengembalikan string yang benar.
Matt Hancock
12

Seperti yang dikatakan Eric Palakovich Carr, Anda dapat menggunakan ketiga varian ini.

Saya lebih suka menggunakannya bersama:

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

Saya lebih suka saat mengembangkan aplikasi lintas bentuk untuk memastikan;)

Faminator
sumber
1
Sedikit lebih bersih: jika n1 == n2 atau n2 == n3: return n1 elif n2 == n3: return n2 else: raise Exception ("Nama komputer tidak sama satu sama lain")
Charles Plager
2
@CharlesPlager Seharusnya: if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")( n1bukan n2)
dexteritas
@dexteritas: Anda benar. (Itu tidak akan membiarkan saya mengeditnya untuk alasan apa pun).
Charles Plager
6

Karena skrip python pasti berjalan di sistem windows, Anda harus menggunakan Win32 API GetComputerName atau GetComputerNameEx

Anda bisa mendapatkan nama DNS yang memenuhi syarat, atau nama NETBIOS, atau berbagai hal lain.

import win32api
win32api.GetComputerName()

>>'MYNAME'

Atau:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'
Brian R. Bondy
sumber
3

Saya yakin gethostname akan bekerja dengan baik.

Janji
sumber
0
import socket
pc = socket.gethostname()
print pc
Pedro Muniz
sumber
6
Harap selalu tambahkan penjelasan untuk jawabannya.
DaFois
1
Selain itu, jawaban ini hanyalah salinan dari jawaban lain berusia 10 tahun yang mendapat suara tinggi .
wovano