خانه / آموزش‌ها / مدیریت پلتفرم و شناسایی سیستم‌عامل در پایتون

مدیریت پلتفرم و شناسایی سیستم‌عامل در پایتون

🐍 HomeOfPython
|
📅 1404/10/18

سطح مقدماتی (Beginner Level)

در برنامه‌نویسی پایتون، اغلب نیاز داریم بدانیم کدهای ما روی چه سیستم‌عاملی (Operating System) یا چه پلتفرمی در حال اجرا هستند. این موضوع زمانی اهمیت پیدا می‌کند که بخواهیم رفتارهای متفاوتی را برای ویندوز (Windows)، مک (macOS) یا لینوکس (Linux) تعریف کنیم. پایتون دو ماژول اصلی sys و platform را برای این کار ارائه می‌دهد.

۱. استفاده از ماژول sys

ساده‌ترین و سریع‌ترین راه برای تشخیص پلتفرم، استفاده از sys.platform است. این ویژگی یک رشته متنی برمی‌گرداند که شناسه سیستم‌عامل را نشان می‌دهد (مثلاً 'win32' برای ویندوز یا 'linux' برای لینوکس).

مثال اول: بررسی ساده پلتفرم

در این مثال، نام پلتفرم را چاپ می‌کنیم. این کد یک اسکریپت کامل است و خروجی می‌دهد.

Python

مثال دوم: اجرای شرطی کد

معمولاً از sys.platform در ساختارهای شرطی استفاده می‌کنیم تا کدهای خاصی را فقط روی سیستم‌عامل‌های خاص اجرا کنیم.

Python

مثال سوم: تابع کمکی (Static)

این یک قطعه کد (Snippet) است که ممکن است در یک برنامه بزرگتر استفاده شود، اما به تنهایی فراخوانی نشده است.

python
import sys

def get_os_name():
    """
    نام سیستم‌عامل را به صورت خوانا برمی‌گرداند.
    """
    if sys.platform.startswith('win'):
        return "Windows"
    elif sys.platform.startswith('linux'):
        return "Linux"
    return "Other"

۲. استفاده از ماژول platform (مقدماتی)

ماژول platform اطلاعات دقیق‌تر و خواناتری نسبت به sys ارائه می‌دهد. تابع platform.system() نام سیستم‌عامل را به صورت استاندارد (مانند 'Windows', 'Linux', 'Darwin') برمی‌گرداند.

ساختار ماژول پلتفرم

مثال اول: دریافت نام سیستم‌عامل و نسخه

این کد کاملاً اجرایی است و اطلاعات کلی سیستم را چاپ می‌کند.

Python

مثال دوم: اطلاعات نسخه دقیق‌تر

گاهی نیاز داریم بدانیم دقیقا چه بیلد (Build) یا نسخه‌ای نصب است.

Python

سطح پیشرفته (Professional Level)

در سطح حرفه‌ای، تنها دانستن نام سیستم‌عامل کافی نیست. ما نیاز داریم معماری پردازنده (۳۲ یا ۶۴ بیت)، نوع مفسر پایتون (CPython, PyPy, Jython) و جزئیات سخت‌افزاری را بدانیم تا بتوانیم کدهای بهینه (Optimized) و پرتابل (Cross-Platform) بنویسیم.

۱. معماری پردازنده و سخت‌افزار

توابع platform.machine() و platform.processor() نوع سخت‌افزار را مشخص می‌کنند. همچنین برای تشخیص دقیق ۳۲ یا ۶۴ بیتی بودن پروسه پایتون، استفاده از ماژول struct دقیق‌تر از platform.architecture() عمل می‌کند (زیرا platform.architecture گاهی به فایل اجرایی اشاره می‌کند نه فضای آدرس‌دهی).

مثال اول: شناسایی معماری پردازنده

کد زیر اطلاعات سخت‌افزاری ماشین را استخراج می‌کند.

Python

مثال دوم: تشخیص دقیق بیت (Bit Depth) با struct

این روش حرفه‌ای‌ترین راه برای فهمیدن این است که پایتون شما به صورت ۳۲ بیتی اجرا می‌شود یا ۶۴ بیتی.

Python

۲. اطلاعات مفسر پایتون (Python Implementation)

در محیط‌های حرفه‌ای، ممکن است کد شما روی PyPy (برای سرعت) یا Jython (برای جاوا) اجرا شود. ماژول platform توابعی برای شناسایی خودِ پایتون دارد.

مثال اول: نسخه و نوع کامپایلر پایتون

این اسکریپت جزئیات محیط اجرایی پایتون را نمایش می‌دهد.

Python

مثال دوم: تابع بررسی سازگاری (Static)

این تابع بررسی می‌کند آیا نسخه پایتون برای اجرای یک ویژگی خاص مناسب است یا خیر (کد استاتیک).

python
import sys

def require_python_version(major, minor):
    """
    بررسی می‌کند آیا نسخه پایتون حداقل مقدار مورد نظر است یا خیر.
    """
    if sys.version_info < (major, minor):
        raise EnvironmentError(f"Must use Python {major}.{minor} or higher")

۳. نوشتن کدهای Cross-Platform (چند پلتفرمی)

یکی از چالش‌های اصلی برنامه‌نویسی حرفه‌ای، مدیریت مسیر فایل‌ها (File Paths) و کتابخانه‌های وابسته به سیستم‌عامل است. ویندوز از \ و یونیکس از / استفاده می‌کند.

نکته فنی:

برای مدیریت مسیرها همیشه از os.path.join یا کتابخانه مدرن pathlib استفاده کنید و هرگز جداکننده‌ها را دستی تایپ نکنید.

مثال اول: مدیریت مسیرها به روش صحیح

این کد نشان می‌دهد چگونه مسیری بسازیم که هم در ویندوز و هم در لینوکس کار کند.

Python

مثال دوم: ایمپورت‌های شرطی (Static)

گاهی اوقات نیاز دارید ماژولی را ایمپورت کنید که فقط در یک سیستم‌عامل وجود دارد (مانند msvcrt در ویندوز).

python
try:
    # مخصوص ویندوز
    import msvcrt
    def get_key():
        return msvcrt.getch()
except ImportError:
    # مخصوص لینوکس/مک
    import sys
    import tty
    import termios
    def get_key():
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch

مثال سوم: بررسی متغیرهای محیطی مرتبط با پلتفرم

بررسی متغیرهای محیطی که در پلتفرم‌های مختلف متفاوت هستند.

Python