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?

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'

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

1
1 karena ini adalah cara terbaik untuk pergi. Ini panggilan lintas platform yang paling efektif.
joshin4colours

20

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


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'


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.