Python komut dosyası çalıştıran Windows bilgisayarın adını mı alıyorsunuz?


98

Temel olarak, ağımda bir python komut dosyası çalıştıran birkaç Windows bilgisayarım var. Bu komut dosyasını hangi bilgisayarda çalıştırdığına bağlı olarak, komut dosyasında farklı bir yapılandırma seçenekleri kümesi kullanılmalıdır.

Python betiğinde bu bilgisayar adını nasıl alırım?

Komut dosyasının DARK-TOWER adlı bir bilgisayarda çalıştığını varsayalım, şöyle bir şey yazmak istiyorum:

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

Kullanabileceğim standart veya üçüncü taraf bir kitaplık var mı?

Yanıtlar:


163

Üç seçenek olduğu ortaya çıktı (daha önce cevaplanmış olan ikisi dahil):

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME']
'DARK-TOWER'

16
Kişinin kendi sorusunu yanıtlamak, bazıları tarafından kötü bir zevk olarak kabul edilebilir, ancak SSS'ye göre gayet iyi: stackoverflow.com/faq
Stephan202

9
Eric, birkaç farklı yanıtı tek bir kaynakta derlediğinden, yeni bir tane (platform) eklemekten bahsetmiyorum bile, hiç de kötü olduğunu düşünmüyorum.
nilamo

4
tamam, bu bir takip için haykırıyor: platform.node () ile socket.gethostname () arasındaki fark nedir? hiç farklı olabilirler mi?
Jason S

4
Posix sistemlerinde, socket.gethostname()libc'yi döndürür gethostname()iken, platform.node()döner platform.uname()[1]biraz ilişkilidir os.uname()hangi libc'yi çağırır uname()... aynı yerde son olabilir gibi görünüyor, ama onlar oraya oldukça farklı yollar almak ve ben güvenerek olmaz değerin farklı platformlarda aynı olması.
Peter Gibson

5
os.environ['COMPUTERNAME']Bunun tüm büyük harfleri döndüreceğini platform.node()ve socket.gethostname()karışık durumu döndürebileceğini belirtmek gerekir .
MrNoob


20

Gönderen https://mail.python.org/pipermail/python-list/2006-April/397494.html

import os
os.getenv('COMPUTERNAME')

5
Bu benim için Python 2.7.2 kullanan OS-X 10.6.8 üzerinde çalışmıyor, Hiçbiri döndürüyor. Ancak açıklanan diğer yöntemler işe yaramaktadır.
Peter Gibson

2
@PeterGibson Ubuntu 12.04'te de aynı şeyi yaşadım.
Daniel F

NoneUbuntu 16.04'te benim için geri dönüyor. İlginç HOSTNAMEbir şekilde, bash'de tanımlanmış bir ortam değişkenidir, ancak her ikisi de doğru dizgeyi döndürürken her ikisi de os.getenv('HOSTNAME')döner . Nonesocket.gethostname()
Matt Hancock

12

Eric Palakovich Carr'ın söylediği gibi bu üç çeşidi kullanabilirsiniz.

Onları birlikte kullanmayı tercih ederim:

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

Emin olmak için çapraz patform uygulamaları geliştirirken tercih ederim;)


1
Biraz daha temiz: eğer n1 == n2 veya n2 == n3 ise: n1 elif n2 == n3 döndür: n2
döndür: İstisnayı artır

2
@CharlesPlager Olmalı: if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")( n1yerine n2)
dexteritas

@dexteritas: Haklısın. (Herhangi bir nedenle düzenlememe izin vermiyor).
Charles Plager

6

Python komut dosyaları kesinlikle bir Windows sisteminde çalıştığından, Win32 API GetComputerName veya GetComputerNameEx kullanmalısınız.

Tam olarak nitelenmiş DNS adını veya NETBIOS adını veya çeşitli farklı şeyleri alabilirsiniz.

import win32api
win32api.GetComputerName()

>>'MYNAME'

Veya:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'


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

6
Lütfen yanıta her zaman bir açıklama ekleyin.
DaFois

1
Ayrıca, bu cevap, 10 yaşındaki çok beğenilen başka bir cevabın sadece bir kopyası .
wovano
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.