Sistem ana bilgisayar adını almak için Python'u nasıl kullanabilirim?


681

Yerel bir ağ için bir sohbet programı yazıyorum. Bilgisayarları tanımlamak ve Python ile kullanıcı tarafından ayarlanan bilgisayar adını almak istiyorum.

Yanıtlar:


1043

Kullanımı socketve gethostname()işlevselliği. Bu hostname, Python yorumlayıcısının çalıştığı bilgisayarı alacaktır :

import socket
print(socket.gethostname())

70
bu doğru değil. Benim için çevrimdışı ve evde çalışıyor, ama şimdi bir ofisim ve bu farklı bir ana bilgisayar adı döndürüyor.
DataGreed

74
Ve FQDN için kullanabileceğinizi unutmayınsocket.getfqdn()
Dave Forgac

31
@DataGreed, ana bilgisayar adınızın değişmesidir. Python'un sorunu değil.
strickli

4
@DataGreed 1. Bu şekilde görünmesine rağmen "rastgele" olmadığından oldukça eminim. 2. Soru, "sistem adı" değil "sistem ana bilgisayar adı" dedi. 3. Çok sayıda sistem için (kuşkusuz pencereler hariç) ana bilgisayar ve sistem adları aynıdır.
strickli

8
Socket.gethostname () ve os.uname () [1] veya platform.uname () [1] arasındaki farkın ne olduğunu merak ediyorsunuz
LetsOMG

388

Her ikisi de oldukça taşınabilir:

import platform
platform.node()

import socket
socket.gethostname()

HOSTVeya HOSTNAMEortam değişkenlerini kullanan hiçbir çözüm taşınabilir değildir. Çalıştırırken sisteminizde çalışıyor olsa bile, cron gibi özel ortamlarda çalıştırıldığında çalışmayabilir.


6
Yarı taşınabilir. Bazı platformlarda platform.node (),
fqdn'yi

3
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
Radar'ın Altında,

8
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
Radar'ın Altında,

7
@ RadartheRadar endişelenmeyin, genellikle komut dosyası başına bunlardan sadece birini çağırırım.
Robert

6
platform.node () os.getenv dosyasından bile daha hızlıdır. gethostname bir yarışmacı bile değil. Ancak zaman bir faktör değilse: import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]platformlar arası olmalı ve varsa ortam değişkenlerini desteklemelidir - bu, HOSTNAME=correct python xyz.py
zorlu

121

Muhtemelen os modülünü zaten yükleyeceksiniz, bu yüzden başka bir öneri:

import os
myhost = os.uname()[1]

8
osModülü kullanarak bir çözüm için +1 . Taşınabilir değil ve gerçekten doğru değil, ama yine de kullanışlı.
MestreLion

20
os.uname Windows'ta desteklenmez: docs.python.org/dev/library/os#os.uname
Noam Manos

9
Ayrıca 3.3 ve daha biraz daha belirgin hale getirmek için os.uname (). Nodename yapabilirsiniz
Hut8

4
Aşağıdaki cevap platform.uname()[1], Windows'da ÇALIŞAN benzer bir görünüm verir .
muhteşem

6
@fantabolous Cevaplar iniş sırasında değişmiş olabileceğinden, muhtemelen "aşağıda" gibi konumsal kelimeler kullanmamalısınız;)
Jonathan Komar

65

Ne dersin :

import platform

h = platform.uname()[1]

Aslında tüm sonuçlara bir göz atmak isteyebilirsiniz. platform.uname()


1
Benim için Ubuntu ve Windows üzerinde çalıştı. Teşekkürler! 👍
GollyJer

61

os.getenv('HOSTNAME')ve os.environ['HOSTNAME']her zaman çalışmaz. Cron işlerinde ve WSDL'de HTTP HOSTNAME ayarlanmadı. Bunun yerine şunu kullanın:

import socket
socket.gethostbyaddr(socket.gethostname())[0]

/ Etc / hosts içinde kısa bir diğer ad tanımlamış olsanız bile, her zaman (Windows'ta bile) tam nitelikli bir ana bilgisayar adı döndürür .

Eğer bir takma ad tanımlı ise / etc / hosts sonra socket.gethostname()diğer adı dönecektir. platform.uname()[1]aynı şeyi yapar.

Yukarıdakilerin işe yaramadığı bir davaya girdim. Şimdi ne kullanıyorum:

import socket
if socket.gethostname().find('.')>=0:
    name=socket.gethostname()
else:
    name=socket.gethostbyaddr(socket.gethostname())[0]

İlk olarak bir ana bilgisayar adı gibi görünen bir şey döndürüp döndürmediğini görmek için gethostname'i çağırır, değilse orijinal çözümümü kullanır.


15
Muhtemelen istediğiniz socket.getfqdn(), ancak OP sorduğu şey değil
jfs

17

Doğruysam socket.gethostname işlevini arıyorsunuz:

>> import socket
>> socket.gethostname()
'terminus'

13

En azından python> = 3.3'ten :

Alanı kullanabilir nodenameve dizi indekslemeyi kullanmaktan kaçınabilirsiniz:

os.uname().nodename

Her ne kadar, hatta dokümantasyon os.uname kullanarak önerirsocket.gethostname()



5

Bazı sistemlerde, ana bilgisayar adı ortamda ayarlanır. Bu sizin için geçerliyse , os modülü os.getenv aracılığıyla ortamdan çıkarabilir . Örneğin, HOSTNAME istediğinizi içeren ortam değişkeniyse, aşağıdakini alır:

import os
system_name = os.getenv('HOSTNAME')

Güncelleme: Yorumlarda belirtildiği gibi, herkesin ortamı bu şekilde ayarlanmadığı için bu her zaman işe yaramaz. Başlangıçta buna cevap verdiğimde, bu çözümü bir web aramasında bulduğum ilk şey olduğu için kullandığımı ve o zaman benim için çalıştığını düşünüyorum. Taşınabilirlik eksikliğinden dolayı muhtemelen bunu şimdi kullanmam. Ancak, bu yanıtı referans amaçlı olarak bırakıyorum. FWIW, ortamınız sistem adına sahipse ve zaten os modülünü içe aktarıyorsanız, diğer ithalatlara olan ihtiyacı ortadan kaldırır. Test edin - programınızın çalışmasını beklediğiniz tüm ortamlarda çalışmazsa, sağlanan diğer çözümlerden birini kullanın.


5
Bu benim için "Hiçbiri" döndürür. Gönderdiğiniz bağlantıya göre, bu 'HOSTNAME' değişkeninin mevcut olmadığı anlamına gelir ...: - /
John

@John: Windows'da mısınız? Benim için bir Linux kutusunda çalıştı, ama Windows'ta da Yok'u alıyorum.
GreenMatt

@MuhiaNJoroge: Bunun uygulama / kurulumunuza bağlı olduğunu düşünüyorum. Bu cevabı yazdığımda bir Red Hat kutusundaydım ve işe yaradı. Şimdi Ubuntu'dayım ve işe yaramıyor. Cevabı değiştirdim.
GreenMatt

Lenovo NAS'ta çalışmıyor, Geri dön Yok. Şimdi ithalat soket baskı kullanıyorum (socket.gethostname ())
Rui Martins

@RuiMartins: Dediğim gibi, her yerde çalışmıyor gibi görünüyor. İşe yarayan bir şey bulmana sevindim.
GreenMatt

5

Benim PyLog conf dosyasında kullanmak için PC adını gerekiyordu ve soket kütüphanesi mevcut değil, ama os kütüphanesi.

İçin , Windows kullandığım:

os.getenv('COMPUTERNAME', 'defaultValue')

DefaultValue, None döndürülmesini önlemek için bir dizedir


12
BİLGİSAYARADI çok Microsoft'a özgü bir ortam değişkenidir ve taşınabilir değildir.
Dwight Spencer

1
Evet, ancak MS sistemleri için çalışır ve eğer uyuyorsa çalışır. Buradaki insanlar, pratiklik ve soru onları ilgisiz kıldıklarında, hız veya platform bağımsızlığına çok fazla karışıyorlar.
Bill Kidd

7
@BillKidd OP söz konusu Windows, OS X ve Linux'tan bahsediyor, bu nedenle sistem taşınabilirliğine ihtiyaç duymak çok makul bir varsayım.
zstewart

1
@BillKidd Genel olarak erken optimizasyon veya taşınabilirlikten kaçınmanız gerektiği doğrudur, ancak daha taşınabilir olduğu için tartışmasız daha sürdürülebilir bir çözüm kullanmamak zıt uçlara gider.
Mad Physicist

2

Bu kod satırını yürütmeniz gerekiyor

sock_name = socket.gethostname()

Sonra addr'i bulmak için adı kullanabilirsiniz:

print(socket.gethostbyname(sock_name))
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.