যখন os.name, sys.platform, বা প্ল্যাটফর্ম.সিস্টেম ব্যবহার করবেন?


106

যতদূর আমি জানি, পাইথনের 3 টি অপারেটিং সিস্টেমটি কী চলছে তা আবিষ্কার করার 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

উত্তর:


69

সোর্স কোডটিতে কিছুটা ডুব দেওয়া হয়েছে।

আউটপুট sys.platformএবং os.nameকম্পাইল সময়ে নির্ধারিত হয়। platform.system()রান টাইমে সিস্টেমের ধরণ নির্ধারণ করে।

  • sys.platform বিল্ড কনফিগারেশনের সময় সংকলক সংজ্ঞায়িত হিসাবে নির্দিষ্ট করা হয়।
  • os.nameকিনা নির্দিষ্ট অপারেটিং সিস্টেম নির্দিষ্ট মডিউল চেক পাওয়া যায় (যেমন posix, nt, ...)
  • platform.system()unameচালুর সময় সিস্টেমের ধরণ নির্ধারণ করতে প্রকৃতপক্ষে সঞ্চালিত হয় এবং সম্ভাব্য অন্যান্য কয়েকটি ফাংশন।

আমার পরামর্শ:

  • os.nameএটি একটি পিক্সিক-কমপ্লায়েন্ট সিস্টেম কিনা তা পরীক্ষা করতে ব্যবহার করুন ।
  • sys.platformএটি কোনও লিনাক্স, সাইগউইন, ডারউইন, অ্যাথিয়াস ইত্যাদি রয়েছে কিনা তা পরীক্ষা করতে ব্যবহার করুন
  • platform.system()আপনি যদি অন্য উত্সগুলিতে বিশ্বাস না করেন তবে ব্যবহার করুন ।

4
আমি আরো গবেষণা করেছেন এবং এখানে বিস্তারিত উত্তর হল: stackoverflow.com/a/58071295/207661
শীতল শাহ

21

তার মাঝে একটি পাতলা লাইন পার্থক্য নেই 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 টি স্ট্রিং রয়েছে: (সংজ্ঞা, নামকরণ, প্রকাশ, সংস্করণ, মেশিন)। কিছু সিস্টেম নোডনামটি 8 টি অক্ষরে বা নেতৃস্থানীয় উপাদানগুলিতে ছিন্ন করে; হোস্টনেম পাওয়ার আরও ভাল উপায় হ'ল সকেট.গথোস্টনাম () বা এমনকি সকেট.জথোস্টবিয়েডড্র (সকেট.জথোস্টনাম ())।

Availability: recent flavors of Unix.

11

sys.platformডক্স থেকে :

  • os.name একটি মোটা দানাদারত্ব আছে
  • os.uname() সিস্টেম-নির্ভর সংস্করণ তথ্য দেয়
  • platformমডিউল সিস্টেমের পরিচয় বিস্তারিত চেক প্রদান করে

কিছু কার্যকারিতা পাওয়া যায় কিনা তা পরীক্ষার প্রায়শই "সেরা" ভবিষ্যতের প্রুফ উপায়টি কেবল এটি ব্যবহার করার চেষ্টা করা এবং যদি এটি ব্যর্থ হয় তবে ফ্যালব্যাক ব্যবহার করুন।

সিএসপ্ল্যাটফর্ম এবং প্ল্যাটফর্ম.সিস্টেম () এর মধ্যে পার্থক্য সম্পর্কে কী বলা যায়?

platform.system()একটি সাধারণ মান এটি বিভিন্ন উত্স থেকে পেতে পারে ফেরৎ: os.uname(), sys.platform, verকমান্ড (Windows এ)।


10

এটি নির্ভর করে যে আপনি ব্যতীত বা উত্সাহিত সিস্টেমে যেকোন চেষ্টা করা পছন্দ করছেন এবং আপনার কোডটি এত উচ্চ স্তরের বা এত নিম্ন স্তরের যে এটি কোনও অনুরূপ অনির্ধারিত সিস্টেমে (যেমন অনির্ধারিত ম্যাক - 'পোস্টিক্স' বা অন এম্বেড করা এআরএম সিস্টেমগুলি)। আরও অজগরটি হ'ল সমস্ত পরিচিত সিস্টেমগুলি গণনা করা নয় তবে সম্ভাব্য প্রাসঙ্গিক বৈশিষ্ট্য পরীক্ষা করা। (উদাহরণস্বরূপ এটি সিস্টেমের চূড়ান্ততা বিবেচনা করা হয় তবে গুরুত্বহীন মাল্টিপ্রসেসিং বৈশিষ্ট্যগুলি বিবেচনা করা হয়))

  • মডিউলটির সঠিক ব্যবহারের জন্য os.name একটি পর্যাপ্ত রেজোলিউশন os। পাইথনের ২.7-এর সম্ভাব্য মানগুলি হ'ল 'পিক্সিক্স', 'এনটি', 'ওএস 2', 'সিএ', 'জাভা' বা 'রিসকোস', তবে পাইথন ৩.৪ থেকে কেবল 'পসিক্স', 'এনটি' এবং 'জাভা' ব্যবহৃত হয়।

  • sys.platform একটি সূক্ষ্ম রেজোলিউশন। if sys.platform.startswith('linux')আইডিয়ম ব্যবহার করার পরামর্শ দেওয়া হচ্ছে কারণ "লিনাক্স 2" এর অর্থ একটি লিনাক্স কার্নেল সংস্করণ ২.২.৫.ক্স বা ৩. পুরানো কার্নেলগুলি বর্তমানে কখনও ব্যবহৃত হয় না। পাইথন ৩.৩-এ সমস্ত লিনাক্স সিস্টেম সহজ 'লিনাক্স' রয়েছে।

আমি "ম্যাক" এবং "জাভা" সিস্টেমগুলির সুনির্দিষ্ট জানি না এবং তাই আমি শাখা প্রশস্ত করার জন্য খুব ভাল পদ্ধতির প্ল্যাটফর্ম.সেটেম () এর ফলাফলগুলি ব্যবহার করতে পারি না, তবে আমি platformবার্তা এবং ত্রুটি লগিংয়ের জন্য মডিউলটির সুবিধাগুলি ব্যবহার করব ।


os.nameসম্ভব রিটার্ন মান 'posix', 'nt', 'java'অনুযায়ী পাইথন 3 ডক্স । আরও দেখুন: প্ল্যাটফর্ম মডিউল ডক্স । আমি বিশ্বাস করি না'riscos' এবং 'os2'এর থেকে সম্ভাব্য প্রত্যাবর্তনের মানগুলি হয় os.name; এগুলি হতে হতে ফেরতের মানsys.platform হতে পারে । পাইথন 3 sys.platformডকুমেন্টেশন সম্পূর্ণ বলে মনে হয় না।
আফিসিক

4
@ আফিক: আমি নতুন পাইথনের জন্য আমার উত্তরটি আপডেট করেছি তবে ঠিক তখনই এটি ছিল। পাইথন ৩.৩ দেখুন - ওসনেম (সেই সময়ে সর্বশেষতম সংস্করণ)। পাইথন ২.7 এখনও সমর্থিত এবং এর জন্য 'রিসকোস' একটি সম্ভাব্য মান।
hynekcer

ধন্যবাদ @ হাইঙ্কার, পাইথন সংস্করণ সংখ্যা যুক্ত করতে আমি আপনার সম্পাদনার প্রশংসা করি। পাইথনের ৩.৩-এর পরে এটি পরিবর্তন হয়েছে বুঝতে না পেরে আমি ক্ষমাপ্রার্থী। আমি ডকুমেন্টেশনের বিভিন্ন সংস্করণটি অনুধাবন করিনি এবং পাইথন 3 এর আচরণ os.nameভার্সনগুলিতে সামঞ্জস্যপূর্ণ হওয়ার গুরুতর ধারণা নিয়েছিলাম । আমি ২.7 ডকুমেন্টেশনটিও ডাবল-চেক করিনি, তবে আমি এখন জানি যে আপনি সঠিক।
এফিক

3

আমি বিশ্বাস করি প্লাটফর্ম মডিউলটি সম্ভবত নতুন কোডের জন্য পছন্দ করা হয়েছে। অন্যরা এর আগেও ছিল। এটি একটি বিবর্তন, এবং অন্যান্যগুলি পিছনের সামঞ্জস্যের জন্য রয়ে যায়।


7
আমি আশ্চর্য হয়েছি যে আমরা এটির জন্য কোনও পাইথন বিকাশকারী পেতে পারি কিনা। এমনকি যে কেউ প্ল্যাটফর্ম মডিউলটি বিকাশ করেছে।
ztangent
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.