ฉันกำลังเขียนโปรแกรมแชทสำหรับเครือข่ายท้องถิ่น ฉันต้องการระบุคอมพิวเตอร์และรับชื่อคอมพิวเตอร์ที่ผู้ใช้ตั้งด้วย Python
ฉันกำลังเขียนโปรแกรมแชทสำหรับเครือข่ายท้องถิ่น ฉันต้องการระบุคอมพิวเตอร์และรับชื่อคอมพิวเตอร์ที่ผู้ใช้ตั้งด้วย Python
คำตอบ:
การใช้socket
และgethostname()
ฟังก์ชั่นของมัน สิ่งนี้จะได้รับhostname
คอมพิวเตอร์ที่ใช้งานตัวแปล Python:
import socket
print(socket.gethostname())
socket.getfqdn()
ทั้งสองแบบพกพาสวย:
import platform
platform.node()
import socket
socket.gethostname()
โซลูชันใด ๆ ที่ใช้HOST
หรือHOSTNAME
ตัวแปรสภาพแวดล้อมไม่สามารถเคลื่อนย้ายได้ แม้ว่ามันจะทำงานบนระบบของคุณเมื่อคุณเรียกใช้มันอาจไม่ทำงานเมื่อทำงานในสภาพแวดล้อมพิเศษเช่น cron
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]
ควรเป็นข้ามแพลตฟอร์มและสนับสนุนตัวแปรสภาพแวดล้อมหากมี - ซึ่งอนุญาตให้ผู้ใช้ควบคุมบางอย่างในสถานการณ์เร่งHOSTNAME=correct python xyz.py
คุณอาจจะโหลดโมดูลระบบปฏิบัติการต่อไปดังนั้นข้อเสนอแนะอื่นจะเป็น:
import os
myhost = os.uname()[1]
os
โมดูล ไม่ใช่แบบพกพาและไม่แม่นยำจริงๆ แต่ก็มีประโยชน์อยู่ดี
platform.uname()[1]
ซึ่งทำงานบน Windows
เกี่ยวกับ:
import platform
h = platform.uname()[1]
ที่จริงแล้วคุณอาจต้องการดูผลลัพธ์ทั้งหมด platform.uname()
os.getenv('HOSTNAME')
และos.environ['HOSTNAME']
ไม่ได้ผลเสมอไป ในงาน cron และ WSDL HTTP HOSTNAME จะไม่ถูกตั้งค่า ใช้สิ่งนี้แทน:
import socket
socket.gethostbyaddr(socket.gethostname())[0]
มันก็จะ (แม้ใน Windows) ส่งกลับชื่อโฮสต์ที่มีคุณสมบัติครบถ้วนแม้ว่าคุณจะกำหนดนามแฝงสั้น ๆ ใน/ etc / hosts
หากคุณกำหนดนามแฝงใน/ etc / hostsแล้วsocket.gethostname()
จะกลับนามแฝง platform.uname()[1]
ทำสิ่งเดียวกัน
ฉันวิ่งเข้าไปในกรณีที่ข้างต้นไม่ทำงาน นี่คือสิ่งที่ฉันใช้ตอนนี้:
import socket
if socket.gethostname().find('.')>=0:
name=socket.gethostname()
else:
name=socket.gethostbyaddr(socket.gethostname())[0]
ก่อนอื่นจะเรียกใช้ gethostname เพื่อดูว่าจะส่งคืนบางสิ่งที่ดูเหมือนชื่อโฮสต์หรือไม่ถ้าไม่ใช่จะใช้โซลูชันดั้งเดิมของฉัน
socket.getfqdn()
แม้ว่ามันจะไม่ใช่สิ่งที่ OP ถาม
ถ้าฉันถูกต้องคุณกำลังมองหาฟังก์ชั่น socket.gethostname:
>> import socket
>> socket.gethostname()
'terminus'
อย่างน้อยหลาม> = 3.3 :
คุณสามารถใช้ฟิลด์nodename
และหลีกเลี่ยงการใช้การทำดัชนีอาร์เรย์:
os.uname().nodename
แม้ว่าเอกสารของos.unameแนะนำให้ใช้socket.gethostname()
socket.gethostname()
ทำได้
ในบางระบบชื่อโฮสต์จะถูกตั้งค่าในสภาพแวดล้อม หากเป็นกรณีที่สำหรับคุณโมดูล OSสามารถดึงมันออกมาจากสภาพแวดล้อมที่ผ่านos.getenv ตัวอย่างเช่นถ้า HOSTNAME เป็นตัวแปรสภาพแวดล้อมที่มีสิ่งที่คุณต้องการสิ่งต่อไปนี้จะได้รับ:
import os
system_name = os.getenv('HOSTNAME')
อัปเดต: ตามที่ระบุไว้ในความคิดเห็นสิ่งนี้อาจไม่ได้ผลเนื่องจากสภาพแวดล้อมของทุกคนไม่ได้รับการตั้งค่าด้วยวิธีนี้ ฉันเชื่อว่าในตอนแรกที่ฉันตอบคำถามนี้ฉันใช้โซลูชันนี้เพราะเป็นสิ่งแรกที่ฉันพบในการค้นหาเว็บและใช้งานได้ในเวลานั้น เนื่องจากขาดการพกพาฉันอาจจะไม่ใช้สิ่งนี้ในตอนนี้ อย่างไรก็ตามฉันจะทิ้งคำตอบนี้ไว้เพื่ออ้างอิง FWIW จะกำจัดความต้องการการนำเข้าอื่น ๆ หากสภาพแวดล้อมของคุณมีชื่อระบบและคุณกำลังนำเข้าโมดูลระบบปฏิบัติการแล้ว ทดสอบถ้าไม่สามารถใช้งานได้ในทุกสภาพแวดล้อมที่คุณคาดว่าโปรแกรมของคุณจะทำงานให้ใช้วิธีการแก้ปัญหาอื่นที่มีให้
ฉันต้องการชื่อของพีซีเพื่อใช้ในไฟล์ PyLog conf ของฉันและซ็อกเก็ตไลบรารี่ไม่สามารถใช้งานได้ แต่ไลบรารี่ของ os คือ
สำหรับWindowsฉันใช้:
os.getenv('COMPUTERNAME', 'defaultValue')
โดยที่ defaultValue เป็นสตริงเพื่อป้องกันไม่มีการส่งคืน
คุณต้องรันรหัสบรรทัดนี้
sock_name = socket.gethostname()
จากนั้นคุณสามารถใช้ชื่อเพื่อค้นหา addr:
print(socket.gethostbyname(sock_name))