Os.name, sys.platform, या platform.system का उपयोग कब करें?


104

जहाँ तक मुझे पता है, पायथन के पास यह पता लगाने के 3 तरीके हैं कि ऑपरेटिंग सिस्टम क्या चल रहा है:

  1. os.name
  2. sys.platform
  3. platform.system()

यह जानकारी जानना अक्सर सशर्त आयातों में उपयोगी है, या कार्यक्षमता का उपयोग करना जो प्लेटफार्मों के बीच भिन्न होता है (जैसे time.clock()विंडोज बनाम time.time()यूनिक्स पर)।

मेरा सवाल है, ऐसा करने के 3 अलग-अलग तरीके क्यों? एक तरह से कब इस्तेमाल किया जाना चाहिए और दूसरा नहीं? कौन सा तरीका 'सबसे अच्छा' है (सबसे भविष्य का सबूत या कम से कम गलती से किसी विशेष प्रणाली को बाहर करने की संभावना है जो आपका कार्यक्रम वास्तव में चल सकता है)?

ऐसा लगता है कि sys.platformअधिक से अधिक विशिष्ट है os.name, तो आप को अलग करने के लिए अनुमति win32से cygwin(के रूप में बस के लिए विरोध nt), और linux2से darwin(के रूप में बस के लिए विरोध posix)। लेकिन अगर ऐसा है, तो क्या sys.platformऔर किसके बीच का अंतर है platform.system()?

उदाहरण के लिए, जो बेहतर है, यह:

import sys
if sys.platform == 'linux2':
    # Do Linux-specific stuff

या यह? :

import platform
if platform.system() == 'Linux':
    # Do Linux-specific stuff

अभी के लिए sys.platform, मैं से चिपका रहूँगा , इसलिए यह प्रश्न विशेष रूप से जरूरी नहीं है, लेकिन मैं इस बारे में कुछ स्पष्टीकरण के लिए बहुत आभारी रहूंगा।


15
का उपयोग sys.platform.startswith('linux')करने के बजाय sys.platform == 'linux2'भविष्य संगतता के लिए
JFS

जवाबों:


68

स्रोत कोड में एक सा हो गया।

के उत्पादन sys.platformऔर os.nameसंकलन समय पर निर्धारित कर रहे हैं। platform.system()सिस्टम प्रकार को रन टाइम पर निर्धारित करता है।

  • sys.platform बिल्ड कॉन्फ़िगरेशन के दौरान संकलक परिभाषित के रूप में निर्दिष्ट किया गया है।
  • os.nameजाँचता है कि कुछ निश्चित विशिष्ट मॉड्यूल उपलब्ध हैं (उदाहरण posixके लिए nt, ...)
  • platform.system()unameरन समय में सिस्टम प्रकार निर्धारित करने के लिए वास्तव में चलता है और कई अन्य कार्य करता है।

मेरा सुझाव:

  • os.nameयह देखने के लिए उपयोग करें कि क्या यह एक पॉज़िक्स-अनुरूप प्रणाली है।
  • sys.platformयह जाँचने के लिए उपयोग करें कि क्या यह एक linux, cygwin, darwin, atheos, आदि है।
  • platform.system()यदि आप अन्य स्रोतों पर विश्वास नहीं करते हैं तो उपयोग करें ।

2
मैंने और अधिक शोध किया और यहाँ विस्तृत जवाब दिया है: stackoverflow.com/a/58071295/207661
शीतल शाह

20

वहाँ के बीच एक पतली रेखा का अंतर है platform.system()और sys.platformऔर दिलचस्प ज्यादातर मामलों के लिए platform.system()करने के लिए घिनौनाsys.platform

यहाँ स्रोत क्या Python2.7\Lib\Platform.py\systemकहता है

def system():

    """ Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'.

        An empty string is returned if the value cannot be determined.

    """
    return uname()[0]

def uname():
    # Get some infos from the builtin os.uname API...
    try:
        system,node,release,version,machine = os.uname()
    except AttributeError:
        no_os_uname = 1

    if no_os_uname or not filter(None, (system, node, release, version, machine)):
        # Hmm, no there is either no uname or uname has returned
        #'unknowns'... we'll have to poke around the system then.
        if no_os_uname:
            system = sys.platform
            release = ''
            version = ''
            node = _node()
            machine = ''

प्रलेखन के अनुसार भी

os.uname ()

वर्तमान ऑपरेटिंग सिस्टम की पहचान करने वाली जानकारी युक्त 5-टपल लौटें। टपल में 5 स्ट्रिंग्स हैं: (sysname, nodename, रिलीज़, संस्करण, मशीन)। कुछ प्रणालियाँ 8 अक्षरों या प्रमुख घटक को नोडनैम ट्रंक करती हैं; होस्टनाम प्राप्त करने का एक बेहतर तरीका socket.gethostname () या यहां तक ​​कि socket.gethostbyaddr (socket.gethostname ()) है।

Availability: recent flavors of Unix.

11

से sys.platformडॉक्स :

  • os.name एक मोटे दानेदारता है
  • os.uname() सिस्टम-निर्भर संस्करण जानकारी देता है
  • platformमॉड्यूल प्रणाली की पहचान के लिए विस्तृत जाँच करता है प्रदान करता है

अक्सर परीक्षण करने के लिए "सबसे अच्छा" भविष्य-प्रूफ तरीका है कि क्या कुछ कार्यक्षमता उपलब्ध है, बस इसका उपयोग करने की कोशिश करें और यदि यह विफल हो जाता है, तो इसका उपयोग करें।

sys.platform और platform.system () के बीच अंतर के बारे में क्या?

platform.system()एक सामान्यीकृत मान है कि यह कई स्रोतों से प्राप्त कर सकते हैं देता है: os.uname(), sys.platform, verआदेश (Windows पर)।


10

यह इस बात पर निर्भर करता है कि क्या आप अपवाद उठाना पसंद करते हैं या किसी अप्रयुक्त प्रणाली पर कुछ भी आज़माना चाहते हैं या क्या आपका कोड इतना उच्च स्तर या इतना निम्न स्तर है कि यह एक समान अप्रयुक्त प्रणाली (जैसे अप्रयुक्त मैक - 'पॉज़िक्स' पर या उस पर काम नहीं कर सकता है) एआरएम सिस्टम एम्बेडेड)। अधिक पायथोनिक सभी ज्ञात प्रणालियों की गणना नहीं करना है, लेकिन संभावित प्रासंगिक गुणों का परीक्षण करना है। (उदाहरण के लिए, यह प्रणाली की महत्वहीनता है, लेकिन महत्वहीन गुणन गुण है।)

  • os.name osमॉड्यूल के सही उपयोग के लिए एक पर्याप्त संकल्प है । पायथन 2.7 में संभावित मान 'पॉज़िक्स', 'एनटी', 'ओएस 2', 'सीए', 'जावा' या 'रिस्कोस' हैं, जबकि पायथन 3.4 के बाद से केवल 'पॉज़िक्स', 'एनटी' और 'जावा' का उपयोग किया जाता है।

  • sys.platform एक बेहतर संकल्प है। यह if sys.platform.startswith('linux')मुहावरे का उपयोग करने के लिए अनुशंसित है क्योंकि "linux2" का अर्थ है लिनक्स कर्नेल संस्करण 2.xx या 3. पुरानी गुठली जिसका उपयोग कभी नहीं किया जाता है। Python 3.3 में सभी Linux सिस्टम सरल 'linux' हैं।

मैं "मैक" और "जावा" सिस्टम की बारीकियों को नहीं जानता और इसलिए मैं ब्रांचिंग के लिए बहुत अच्छी विधि platform.system () के परिणामों का उपयोग नहीं कर सकता, लेकिन मैं platformसंदेश और त्रुटि लॉगिंग के लिए मॉड्यूल के फायदे का उपयोग करूंगा ।


os.nameसंभावित वापसी मान हैं 'posix', 'nt', 'java'के अनुसार अजगर 3 डॉक्स । यह भी देखें: मंच मॉड्यूल डॉक्स । मुझे विश्वास नहीं है 'riscos'और 'os2'से संभावित वापसी मान हैं os.name; वे से वापसी मानsys.platform हो सकता हैअजगर 3 sys.platformप्रलेखन संपूर्ण होने के लिए प्रकट नहीं होता।
afeique

1
@ कैफे: मैंने नए पायथन के लिए अपना जवाब अपडेट किया, लेकिन यह उस समय सही था। देखें अजगर 3.3 - os.name (उस समय नवीनतम संस्करण)। पायथन 2.7 अभी भी समर्थित है और 'रिस्कोस' इसके लिए एक संभावित मूल्य है।
hynekcer

धन्यवाद @hynekcer, मैं पायथन संस्करण संख्याओं को जोड़ने के लिए आपके संपादन की सराहना करता हूं। मैं पायथन 3.3 के बाद इसे बदल नहीं पाने के लिए माफी मांगता हूं। मैंने दस्तावेज़ीकरण के विभिन्न संस्करणों को भ्रमित नहीं किया और सकल धारणा बनाई कि पायथन 3 का व्यवहार os.nameसंस्करणों के अनुरूप था। मैंने 2.7 दस्तावेज़ीकरण की दोबारा जांच नहीं की , लेकिन मुझे पता है कि अब आप सही हैं।
afeique

3

मेरा मानना ​​है कि प्लेटफॉर्म मॉड्यूल शायद नए कोड के लिए पसंद किया जाता है। इससे पहले बाकी लोग मौजूद थे। यह एक विकास है, और अन्य पीछे संगतता के लिए रहते हैं।


7
मुझे आश्चर्य है कि अगर हम इसकी पुष्टि करने के लिए किसी भी पायथन डेवलपर्स को प्राप्त कर सकते हैं। हो सकता है कि जिसने भी प्लेटफॉर्म मॉड्यूल विकसित किया हो।
2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.