পাইথনে মডিউলগুলির শর্তসাপেক্ষ আমদানি


140

আমার প্রোগ্রামে আমি উইন্ডোজ বা লিনাক্স যে ওএস চালু আছে তার উপর ভিত্তি করে সিম্পজসন বা জসন আমদানি করতে চাই। আমি ব্যবহারকারীর কাছ থেকে ইনপুট হিসাবে ওএসের নাম নিই। এখন, নিম্নলিখিতগুলি করা কি সঠিক?

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

33
আপনি কেন ব্যবহারকারী থেকে ইনপুট হিসাবে ওএসের নাম নিচ্ছেন? প্ল্যাটফর্ম মডিউলটি দেখুন। ডকস.পাইথন.আর.লিবারি platform.platform() / প্ল্যাটফর্ম এইচটিএমএল বা platform.system()প্রত্যেকবার কোডটি চালানোর সময় কোনও ব্যবহারকারীকে কিছু ইনপুট দেওয়ার চেয়ে আপনার যা প্রয়োজন তা করা উচিত।
জো কিংটন

56
@ এসলট: সিরিয়াসলি? আপনি কি জানেন যে আপ / ডাউনভোটগুলি প্রশ্নের মানের প্রতিফলন বোঝানো হয়েছে , তাই না? এবং আপনি অপির কোডে অন্য কোনও কিছুতে একমত হন কিনা তা নয় ।
জাল্ফ

2
@ জালফ: ব্যাকরণ ব্যতীত এটি প্রতিটি ক্ষেত্রেই একটি খারাপ প্রশ্ন। এটি কোনও ধরণের অনুসন্ধানের শীর্ষ প্রতিক্রিয়া হিসাবে খুঁজে পাওয়া উচিত নয়।
এস .লট

11
@ এস লোট শর্তসাপেক্ষ আমদানি অজগর কিনা তা জানতে চাওয়াতে কোনও দোষ নেই। আপনার প্রচেষ্টা সত্ত্বেও এটির মধ্যে +50 আপ ভোট হওয়ায় অবশ্যই অন্যরা সম্মত হয়।
সরোস

5
আমি যে ধারণাটি খুঁজছিলাম তার জন্য +1 (উইন ব্যবহার করে তবেই আমদানি করুন); এবং হাস্যকর ডাউন-ভোটের ক্ষতিপূরণ দেওয়ার জন্য অন্য একটি ধারণাগত +1।
এস

উত্তর:


182

আমি এই প্রতিমাটি প্রচুর ব্যবহার করে দেখেছি, সুতরাং আপনাকে ওএস স্নিফিংও করতে হবে না:

try:
    import json
except ImportError:
    import simplejson as json

17
আপনার প্রথমে আমদানির চেষ্টা করা উচিত simplejson as jsonকারণ এটি সম্ভবত স্ট্যান্ডার্ড jsonমডিউলটির একটি নতুন (দ্রুত) সংস্করণ ।
সেপ্পো এরভিউলি

বা ujsonগতির জন্য
লাববিডি

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

এটি কেবলমাত্র সেই ক্ষেত্রেই ব্যবহার করা উচিত যেখানে আপনি ধরে নিচ্ছেন এবং দৃ interface় গ্যারান্টি দরকার যা নির্দিষ্ট ইন্টারফেস / বৈশিষ্ট্যগুলি থাকবে: যেমন একটি ফাইল ' /dev/ttyX। আপনার ক্ষেত্রে: জেএসওনের সাথে কাজ করে এমন কিছুই নেই যা আসলে ওএস-নির্দিষ্ট এবং আপনি কেবল প্যাকেজটি উপস্থিত আছে কিনা তা পরীক্ষা করে দেখছেন। সেক্ষেত্রে, শুধু tryএটা আমদানি করতে হয় এবং ফল-ব্যাক একটি সঙ্গে exceptতা করতে ব্যর্থ হলে:

try:
    import some_specific_json_module as json
except ImportError:
    import json

11
না, এটা সিদ্ধান্ত নিতে হবে হার্ডকোড ওএস নাম খুব ভুল simplejsonবা jsonপাওয়া যায়। আপনি সহজাতভাবে ওএস-নির্দিষ্ট আমদানিগুলি থেকে কোড উদ্ধৃত করছেন , এটি একটি খুব আলাদা কেস। সঠিক পদ্ধতির জন্য ম্যাট এর উত্তর দেখুন।
গ্লেন মেইনার্ড

16
@ গ্লেন মেইনার্ড: আমি তখন আপনাকে পেছিয়ে দেব; আমি কখনই jsonপ্যাকেজটি ব্যবহার করি নি এবং আরও সাধারণ "আপনি কি মডিউলগুলির শর্তসাপেক্ষ আমদানি করতে পারেন" প্রশ্নের উত্তর দেওয়ার চেষ্টা করছিলাম।
নিক টি

7

ওএস প্ল্যাটফর্মের সাথে জেসন বা সিম্পজসনকে বাঁধাই ব্যবহার করার পরামর্শ দেওয়া হয় না। সিম্পজসন হ'ল জসনের নতুন এবং উন্নত সংস্করণ তাই আমাদের এটি প্রথমে আমদানির চেষ্টা করা উচিত।

পাইথন সংস্করণের উপর ভিত্তি করে আপনি জসন বা সিম্পজসন আমদানি করার জন্য নীচের উপায়ে চেষ্টা করতে পারেন

import sys
if sys.version_info > (2, 7):
    import simplejson as json
else:
    import json
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.