ได้รับชื่อของคอมพิวเตอร์ windows ที่ใช้สคริปต์ python?


98

โดยพื้นฐานแล้วฉันมีคอมพิวเตอร์ Windows สองเครื่องในเครือข่ายของฉันซึ่งจะใช้งานสคริปต์ python ควรใช้ชุดตัวเลือกการกำหนดค่าที่แตกต่างกันในสคริปต์ทั้งนี้ขึ้นอยู่กับคอมพิวเตอร์ที่เรียกใช้สคริปต์นี้

ฉันจะรับชื่อคอมพิวเตอร์นั้นในสคริปต์ python ได้อย่างไร

สมมติว่าสคริปต์ทำงานบนคอมพิวเตอร์ชื่อ DARK-TOWER ฉันต้องการเขียนสิ่งนี้:

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

มีไลบรารีมาตรฐานหรือของบุคคลที่สามที่ฉันสามารถใช้ได้หรือไม่?

คำตอบ:


163

ปรากฎว่ามีสามตัวเลือก (รวมทั้งสองตัวเลือกก่อนหน้านี้):

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

16
การตอบคำถามของตัวเองอาจถือได้ว่าเป็นรสนิยมที่ไม่ดีสำหรับบางคน แต่ก็ใช้ได้ดีตามคำถามที่พบบ่อย: stackoverflow.com/faq
Stephan202

9
ฉันไม่คิดว่ามันไม่ดีเลยเพราะ Eric กำลังรวบรวมคำตอบที่แตกต่างกันสองสามอย่างไว้ในแหล่งข้อมูลเดียวไม่ต้องพูดถึงการเพิ่มใหม่ (แพลตฟอร์ม)
nilamo

4
ตกลงดังนั้นสิ่งนี้จึงร้องให้ติดตาม: ความแตกต่างระหว่าง platform.node () และ socket.gethostname () คืออะไร? พวกเขาจะแตกต่างกันได้หรือไม่?
Jason S

4
ในระบบ posix ให้socket.gethostname()ส่งคืน libc gethostname()ในขณะที่platform.node()ผลตอบแทนplatform.uname()[1]ซึ่งค่อนข้างเกี่ยวข้องกับos.uname()สิ่งที่เรียก libc uname()... ดูเหมือนว่าพวกเขาอาจจะจบลงที่เดียวกัน แต่พวกเขาใช้เส้นทางที่แตกต่างกันมากเพื่อไปที่นั่นและฉันจะไม่พึ่งพา บนมูลค่าที่เหมือนกันในแพลตฟอร์มต่างๆ
Peter Gibson

5
น่าสังเกตว่าos.environ['COMPUTERNAME']จะส่งคืนตัวพิมพ์ใหญ่ทั้งหมดในขณะที่platform.node()และsocket.gethostname()สามารถส่งคืนตัวพิมพ์เล็ก
MrNoob

34
import socket
socket.gethostname()

1
+1 สำหรับวิธีนี้เป็นวิธีที่ดีที่สุด เป็นการโทรข้ามแพลตฟอร์มที่มีประสิทธิภาพสูงสุด
joshin4colours

20

จากhttps://mail.python.org/pipermail/python-list/2006-April/397494.html

import os
os.getenv('COMPUTERNAME')

5
สิ่งนี้ใช้ไม่ได้สำหรับฉันบน OS-X 10.6.8 โดยใช้ Python 2.7.2 แต่จะคืนค่า None อย่างไรก็ตามวิธีการอื่น ๆ ที่อธิบายไว้ได้ผล
Peter Gibson

2
@PeterGibson ฉันมีสิ่งเดียวกันเกิดขึ้นกับฉันบน Ubuntu 12.04
Daniel F

ส่งคืนให้Noneฉันบน Ubuntu 16.04 ที่น่าสนใจHOSTNAMEคือตัวแปรสภาพแวดล้อมที่กำหนดไว้ใน bash แต่ทั้งสองos.getenv('HOSTNAME')จะคืนค่าNoneในขณะที่socket.gethostname()ส่งคืนสตริงที่ถูกต้อง
Matt Hancock

12

ดังที่ Eric Palakovich Carr กล่าวว่าคุณสามารถใช้สามตัวแปรนี้ได้

ฉันชอบใช้ร่วมกัน:

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

ฉันชอบมันเมื่อพัฒนาแอปพลิเคชัน cross patform เพื่อให้แน่ใจ;)


1
ทำความสะอาดเล็กน้อย: ถ้า n1 == n2 หรือ n2 == n3: ส่งคืน n1 elif n2 == n3: ส่งคืน n2 else: เพิ่มข้อยกเว้น ("ชื่อคอมพิวเตอร์ไม่เท่ากัน")
Charles Plager

2
@CharlesPlager มันควรจะเป็น: if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")( n1แทนn2)
dexteritas

@dexteritas: คุณถูกต้อง (จะไม่ให้ฉันแก้ไขไม่ว่าด้วยเหตุผลใดก็ตาม)
Charles Plager

6

เนื่องจาก python scrips ทำงานบนระบบ windows อย่างแน่นอนคุณควรใช้ Win32 API GetComputerNameหรือGetComputerNameEx

คุณสามารถรับชื่อ DNS แบบเต็มหรือชื่อ NETBIOS หรือสิ่งต่างๆได้

import win32api
win32api.GetComputerName()

>>'MYNAME'

หรือ:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.