पायथन में मॉड्यूल का सशर्त आयात


140

मेरे कार्यक्रम में मैं यह चाहता हूं कि यूजर जो विंडोज या लिनक्स पर है, उसके आधार पर सिंपलसन या जोंस का आयात करें। मैं उपयोगकर्ता से इनपुट के रूप में ओएस नाम लेता हूं। अब, क्या निम्न करना सही है?

osys = raw_input("Press w for windows,l for linux")
if (osys == "w"):
    import json as simplejson
else:
    import simplejson  

33
आप उपयोगकर्ता से इनपुट के रूप में ओएस नाम क्यों ले रहे हैं? प्लेटफ़ॉर्म मॉड्यूल में देखें। docs.python.org/library/platform.html platform.platform() या platform.system()उपयोगकर्ता को कोड चलाने के दौरान हर बार कुछ इनपुट करने की बजाय ऐसा करना चाहिए जो आपको चाहिए।
जो किंग्सटन

56
@ S.Lott: गंभीरता से? आप जानते हैं कि अप / डाउनवोट्स प्रश्न की गुणवत्ता को प्रतिबिंबित करने के लिए हैं , है ना? और नहीं कि आप ओपी के कोड में किसी और चीज से सहमत हैं या नहीं ।
jalf

2
@ जैलफ: यह व्याकरण को छोड़कर हर तरह से एक बुरा सवाल है। इसे किसी भी तरह की खोज के लिए शीर्ष प्रतिक्रिया के रूप में नहीं मिलना चाहिए।
एस.लॉट

11
@ S.Lott में यह जानना चाहते हैं कि सशर्त आयात अजगर हैं या नहीं। और स्पष्ट रूप से अन्य लोग सहमत हैं क्योंकि आपके प्रयासों के बावजूद इसमें +50 वोट हैं।
SAROS

5
मैं जिस अवधारणा की तलाश कर रहा था, उसके लिए +1 (केवल विन का उपयोग करते हुए आयात करें); और हास्यास्पद नीचे वोट के लिए क्षतिपूर्ति करने के लिए एक और वैचारिक +1।
S3DEV

जवाबों:


182

मैंने देखा है कि इस मुहावरे का बहुत उपयोग होता है, इसलिए आपको ओएस सूँघने की भी ज़रूरत नहीं है:

try:
    import json
except ImportError:
    import simplejson as json

17
आपको पहले आयात करने का प्रयास करना चाहिए simplejson as jsonक्योंकि यह मानक jsonमॉड्यूल का एक नया (तेज) संस्करण होने की संभावना है ।
सेप्पो एरविला

या ujsonगति के लिए
lababidi

59

अपने शीर्षक में प्रश्न का उत्तर देने के लिए लेकिन आपके द्वारा प्रदान किया गया विशेष मामला नहीं, यह पूरी तरह से सही है, टन के पैकेज ऐसा करते हैं। उपयोगकर्ता पर भरोसा करने के बजाय खुद ओएस का पता लगाना बेहतर है; यहाँ एक उदाहरण के रूप में कर रही है।

serial/__init__.py

import sys

if sys.platform == 'cli':
    from serial.serialcli import Serial
else:
    import os
    # chose an implementation, depending on os
    if os.name == 'nt':  # sys.platform == 'win32':
        from serial.serialwin32 import Serial
    elif os.name == 'posix':
        from serial.serialposix import Serial, PosixPollSerial, VTIMESerial  # noqa
    elif os.name == 'java':
        from serial.serialjava import Serial
    else:
        raise ImportError(
            "Sorry: no implementation for your platform ('{}') available".format(
                os.name
            )
        )

यह केवल उन मामलों में उपयोग किया जाना चाहिए जहां आप मान रहे हैं और एक मजबूत गारंटी की आवश्यकता है कि कुछ इंटरफेस / सुविधाएँ होंगी: उदाहरण के लिए 'फ़ाइल' नामक /dev/ttyX। आपके मामले में: JSON से निपटना, वास्तव में OS- विशिष्ट कुछ भी नहीं है और आप केवल जाँच कर रहे हैं कि पैकेज मौजूद है या नहीं। उस मामले में, बस tryइसे आयात करने के लिए, और exceptअगर यह विफल रहता है, तो वापस आना चाहिए:

try:
    import some_specific_json_module as json
except ImportError:
    import json

11
नहीं, यह तय करना simplejsonया jsonउपलब्ध है कि ओएस नामों को हार्डकोड करना बहुत गलत है। आप स्वाभाविक रूप से OS- विशिष्ट आयात से कोड उद्धृत कर रहे हैं , जो एक बहुत ही अलग मामला है। सही दृष्टिकोण के लिए मैट का जवाब देखें।
ग्लेन मेनार्ड

16
@ ग्लेन मेनार्ड: मैं आपको तब डिफर करूँगा; मैंने कभी jsonपैकेज का उपयोग नहीं किया है और अधिक सामान्य उत्तर देने की कोशिश कर रहा था "क्या आप मॉड्यूल के सशर्त आयात कर सकते हैं" सवाल।
निक टी

7

ओएस प्लेटफॉर्म के साथ जसन या सिंपलसन को बांधने के लिए उपयोग करना उचित नहीं है। simplejson json का नया और उन्नत संस्करण है, इसलिए हमें इसे पहले आयात करने का प्रयास करना चाहिए।

अजगर संस्करण के आधार पर आप नीचे दिए गए तरीके से यासन या सिम्पसन को आयात करने का प्रयास कर सकते हैं

import sys
if sys.version_info > (2, 7):
    import simplejson as json
else:
    import json
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.