सिस्टम होस्टनाम प्राप्त करने के लिए मैं पायथन का उपयोग कैसे कर सकता हूं?


681

मैं एक स्थानीय नेटवर्क के लिए एक चैट कार्यक्रम लिख रहा हूं। मैं कंप्यूटर की पहचान करना और पायथन के साथ उपयोगकर्ता-सेट कंप्यूटर नाम प्राप्त करना चाहूंगा।

जवाबों:


1043

उपयोग socketऔर इसकी gethostname()कार्यक्षमता। यह hostnameउस कंप्यूटर से मिलेगा जहां पायथन इंटरप्रेटर चल रहा है:

import socket
print(socket.gethostname())

70
ठीक है, यह सही नहीं है। यह मेरे लिए ऑफ़लाइन और घर में काम करता है, लेकिन अब मैं एक कार्यालय हूं और यह एक अलग होस्ट नाम देता है।
डेटाग्रेड

74
और ध्यान दें कि FQDN के लिए आप उपयोग कर सकते हैंsocket.getfqdn()
डेव फोर्गैक

31
@DataGreed ऐसा है क्योंकि आपका होस्टनाम बदल रहा है। अजगर की समस्या नहीं।
स्ट्रिकली

4
@DataGreed 1. मैं काफी हद तक निश्चित हूं कि यह "यादृच्छिक" नहीं है, हालांकि यह आपके लिए ऐसा हो सकता है। 2. प्रश्न में कहा गया है "सिस्टम होस्टनाम", न कि "सिस्टम नाम"। 3. बड़ी संख्या में सिस्टम के लिए (माना जाता है कि विंडोज़ सहित) होस्ट और सिस्टम नाम समान नहीं हैं।
strickli

8
बस जिज्ञासु क्या socket.gethostname () और os.uname () [1] या platform.uname () [1] के बीच अंतर है
LetsOMG

388

ये दोनों बहुत पोर्टेबल हैं:

import platform
platform.node()

import socket
socket.gethostname()

HOSTया HOSTNAMEपर्यावरण चर का उपयोग करने वाला कोई भी समाधान पोर्टेबल नहीं है। भले ही आप इसे चलाते समय आपके सिस्टम पर काम करते हों, लेकिन क्रोन जैसे विशेष वातावरण में चलने पर यह काम नहीं कर सकता है।


6
खैर, अर्ध-पोर्टेबल। कुछ प्लेटफार्मों पर, platform.node () fqdn देता है और दूसरों पर, केवल होस्टनाम
रेनडॉग 308

3
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
राडार

8
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
राडार

7
@ बेलो रदर चिंता मत करो, मैं आमतौर पर केवल स्क्रिप्ट के अनुसार इनमें से किसी एक को कॉल करता हूं।
रॉबर्ट रॉबर्ट

6
platform.node () os.getenv से भी तेज है। gethostname भी एक दावेदार नहीं है। लेकिन अगर कोई कारक नहीं है: import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]क्रॉस-प्लेटफ़ॉर्म होना चाहिए और अगर वे मौजूद हैं तो पर्यावरण चर का समर्थन करना चाहिए - जो HOSTNAME=correct python xyz.py
बाहरी

121

आप शायद वैसे भी ओएस मॉड्यूल को लोड करेंगे, इसलिए एक और सुझाव होगा:

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

8
osमॉड्यूल का उपयोग कर समाधान के लिए +1 । पोर्टेबल नहीं है और वास्तव में सटीक नहीं है, लेकिन वैसे भी काम करते हैं।
मेस्ट्रेलियन

20
os.uname Windows पर समर्थित नहीं है: docs.python.org/dev/library/os#os.uname
Noam Manos

9
आप यह भी कर सकते हैं। os.uname ()।
नोडोडेन

4
नीचे दिया गया एक उत्तर समान रूप देता है platform.uname()[1], जो विंडोज पर काम करता है।
काल्पनिक

6
@fantabolous शायद आपको "नीचे" जैसे स्थितीय शब्दों का उपयोग नहीं करना चाहिए क्योंकि उत्तर लैंडिंग के दौरान स्थानांतरित हो सकते हैं;)
जोनाथन कोमर

65

व्हाट अबाउट :

import platform

h = platform.uname()[1]

वास्तव में आप में सभी परिणाम के लिए एक नज़र रखना चाहते हो सकता है platform.uname()


1
मेरे लिए उबंटू और विंडोज पर काम किया। धन्यवाद! 👍
GollyJer

61

os.getenv('HOSTNAME')और os.environ['HOSTNAME']हमेशा काम नहीं करते। क्रॉन जॉब्स और WSDL में, HTTP HOSTNAME सेट नहीं है। इसके बजाय इसका उपयोग करें:

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

यह हमेशा (यहां तक ​​कि विंडोज पर) पूरी तरह से योग्य होस्ट नाम देता है, भले ही आपने / etc / मेजबान में एक छोटा उपनाम परिभाषित किया हो

यदि आपने / आदि / मेजबानों में एक उपनाम को परिभाषित किया है तो socket.gethostname()उपनाम वापस कर देगा।platform.uname()[1]वही काम करता है।

मैं एक ऐसे मामले में भाग गया जहाँ ऊपर काम नहीं किया। यह वही है जो मैं अभी उपयोग कर रहा हूं:

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

यह पहले यह देखने के लिए gethostname को कॉल करता है कि क्या यह कुछ ऐसा है जो एक होस्ट नाम की तरह दिखता है, अगर यह मेरे मूल समाधान का उपयोग नहीं करता है।


15
आप शायद चाहते हैं socket.getfqdn(), हालांकि यह नहीं है कि ओपी क्या पूछता है
jfs


13

कम से कम अजगर से = = 3.3 :

आप फ़ील्ड का उपयोग कर सकते हैं nodenameऔर सरणी अनुक्रमण का उपयोग करने से बच सकते हैं :

os.uname().nodename

हालांकि, यहां तक ​​कि os.uname के प्रलेखन का उपयोग करने का सुझाव देता हैsocket.gethostname()



5

कुछ सिस्टम पर, होस्टनाम वातावरण में सेट है। यदि आपके लिए यही स्थिति है, तो ओएस मॉड्यूल , ओस्सेटिव के माध्यम से इसे पर्यावरण से बाहर निकाल सकता है । उदाहरण के लिए, यदि HOSTNAME पर्यावरण चर है जिसमें आप चाहते हैं, तो निम्नलिखित मिलेगा:

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

अपडेट: जैसा कि टिप्पणियों में कहा गया है, यह हमेशा काम नहीं करता है, क्योंकि हर किसी का वातावरण इस तरह से सेट नहीं किया जाता है। मेरा मानना ​​है कि जिस समय मैंने शुरू में इसका उत्तर दिया था मैं इस समाधान का उपयोग कर रहा था क्योंकि यह पहली चीज थी जिसे मैंने वेब खोज में पाया था और यह उस समय मेरे लिए काम करती थी। पोर्टेबिलिटी की कमी के कारण मैं शायद अब इसका इस्तेमाल नहीं करूंगा। हालांकि, मैं इस जवाब को संदर्भ उद्देश्यों के लिए छोड़ रहा हूं। एफडब्ल्यूआईडब्ल्यू, यह अन्य आयातों की आवश्यकता को समाप्त करता है यदि आपके पर्यावरण में सिस्टम का नाम है और आप पहले से ही ओएस मॉड्यूल आयात कर रहे हैं। इसका परीक्षण करें - यदि यह उन सभी वातावरणों में काम नहीं करता है जिसमें आप अपने कार्यक्रम को संचालित करने की अपेक्षा करते हैं, तो दिए गए अन्य समाधानों में से एक का उपयोग करें।


5
वह मेरे लिए "कोई नहीं" लौटाता है। आपके द्वारा पोस्ट किए गए लिंक के अनुसार, इसका मतलब है कि चर 'HOSTNAME' मौजूद नहीं है ...: - /
John

@ जॉन: क्या आप विंडोज पर हैं? यह मेरे लिए एक लिनक्स बॉक्स पर काम करता था, लेकिन मुझे विंडोज पर भी कोई नहीं मिलता।
ग्रीनमैट

@MuhiaNJoroge: मुझे लगता है कि यह आपके कार्यान्वयन / स्थापना पर निर्भर करता है। जब मैंने वह उत्तर लिखा तो मैं Red Hat बॉक्स पर था और यह काम कर रहा था। अब मैं उबंटू पर हूं और यह काम नहीं करता है। मैंने उत्तर को संशोधित कर दिया है।
ग्रीनमैट

लेनोवो एनएएस में काम नहीं, कोई नहीं लौटा। अब मैं इम्पोर्ट सॉकेट प्रिंट (सॉकेट.गेटहोस्टनेम ()) का उपयोग कर रहा हूँ
रुई मार्टिन्स

@ रुईमार्टिन्स: जैसा कि मैंने कहा, यह हर जगह काम नहीं करता है। खुशी है कि आपको कुछ मिला जो काम करता है।
ग्रीनमैट

5

मुझे अपने PyLog conf फ़ाइल में उपयोग करने के लिए पीसी के नाम की आवश्यकता थी, और सॉकेट लाइब्रेरी उपलब्ध नहीं है, लेकिन ओएस लाइब्रेरी है।

के लिए विंडोज मैं प्रयोग किया है:

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

जहां DefaultValue एक स्ट्रिंग है जिसे कोई नहीं लौटा सकता है


12
COMPUTERNAME एक बहुत ही Microsoft केवल पर्यावरण चर है और पोर्टेबल नहीं है।
ड्वाइट स्पेंसर

1
हां, लेकिन यह एमएस सिस्टम के लिए काम करता है, और अगर यह फिट बैठता है, तो यह काम करता है। जब व्यावहारिकता और सवाल उन्हें अप्रासंगिक कर देते हैं तो कई बार लोग गति या प्लेटफ़ॉर्म आज़ादी पर भी उलझ जाते हैं।
बिल किड

7
@ बिलकिड ओपी ने प्रश्न में विंडोज, ओएस एक्स और लिनक्स का उल्लेख किया है, इसलिए सिस्टम पोर्टेबिलिटी की आवश्यकता एक बहुत ही उचित धारणा है।
20

1
@BillKidd जबकि सामान्य तौर पर यह सच है कि आपको समय से पहले अनुकूलन या पोर्टेबिलिटी से बचना चाहिए, आसानी से उपलब्ध नहीं है और यकीनन अधिक बनाए रखने योग्य समाधान का उपयोग नहीं करना चाहिए क्योंकि यह अधिक पोर्टेबल विपरीत चरम पर जा रहा है।
मैड फिजिसिस्ट

2

आपको कोड की इस लाइन को निष्पादित करना होगा

sock_name = socket.gethostname()

और फिर आप एड्र को खोजने के लिए नाम का उपयोग कर सकते हैं:

print(socket.gethostbyname(sock_name))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.