ویژگی تصویر

کتابخانه sys در پایتون — معرفی جامع و نکات عملی

  /  پایتون   /  کتابخانه sys در پایتون
بنر تبلیغاتی الف

ماژول sys یکی از پایه‌ای‌ترین ماژول‌های استاندارد پایتون است که رابطی با مفسر و محیط اجرایی فراهم می‌کند. استفاده از sys در اسکریپت‌ها و برنامه‌های تولیدی و تستی بسیار رایج است؛ چرا که دسترسی به پارامترها، مسیرهای import، خروجی/ورودی استاندارد و اطلاعات نسخه را ساده می‌کند.

چرا sys مهم است؟

sys برای مواردی که نیاز به تعامل با خود مفسر یا محیط اجرای برنامه دارید ضروری است: خواندن آرگومان‌های خط فرمان، خروج با کد مشخص، تغییر مسیرهای جستجوی ماژول، دریافت اطلاعات نسخه و مدیریت استک استثناها فقط نمونه‌هایی از کاربردهای رایج آن هستند.

مهم‌ترین اعضای ماژول sys

  • sys.argv — آرگومان‌های خط فرمان
  • sys.exit(code) — خروج با کد وضعیت
  • sys.stdin, sys.stdout, sys.stderr — جریان‌های استاندارد
  • sys.path — مسیرهای جستجوی ماژول
  • sys.modules — ماژول‌های وارد شده
  • sys.version, sys.platform, sys.executable — اطلاعات محیط و نسخه
  • sys.setrecursionlimit / sys.getrecursionlimit — حد بازگشت پشته
  • sys.maxsize, sys.byteorder — ویژگی‌های پلتفرم
  • sys.exc_info() — اطلاعات در مورد آخرین استثناء

نمونه: خواندن آرگومان‌های خط فرمان (sys.argv)

import sys

if len(sys.argv) < 2:
    print("Usage: python script.py ")
    sys.exit(1)

name = sys.argv[1]
print(f"Hello, {name}!")

این اسکریپت نام کاربر را از آرگومان خط فرمان می‌گیرد. sys.argv یک لیست از رشته‌هاست؛ عنصر صفر نام فایل اسکریپت و عناصر بعدی آرگومان‌ها را نمایان می‌کنند. استفاده از sys.exit با کد غیرصفر معمولاً به معنی بروز خطا برای سیستم عامل است.

ورودی و خروجی استاندارد: stdin, stdout, stderr

import sys

for line in sys.stdin:
    sys.stdout.write(line.upper())

sys.stderr.write("This is an error messagen")

در مثال بالا: خطوط خوانده شده از stdin (مثلاً هنگام pipe) به حروف بزرگ تبدیل شده و به stdout نوشته می‌شوند. پیغام‌های خطا را بهتر است به stderr بفرستیم تا با خروجی اصلی تداخل نداشته باشد. این تفکیک برای لاگ‌گیری و ریدایرکت مفید است.

چرا stdout و stderr جدا باشند؟

جریانکاربرد
stdoutخروجی معمولی برنامه (داده قابل پردازش)
stderrپیغام‌های خطا و لاگ کوتاه (برای کاربر یا دیباگ)

مدیریت مسیرهای import با sys.path

import sys
# افزودن مسیر به ابتدای sys.path برای بارگذاری ماژول‌های محلی
sys.path.insert(0, "/path/to/my/libs")

import my_custom_module

sys.path یک لیست از مسیرهاست که مفسر برای یافتن ماژول‌ها جستجو می‌کند. افزودن مسیر به ابتدای لیست باعث می‌شود نسخه محلی یا سفارشی شما جایگزین نسخه نصب‌شده شود. در محیط تولیدی بهتر است از virtualenv یا تنظیم PYTHONPATH استفاده کنید تا تغییرات پویا در sys.path نیاز نباشد.

دیدن ماژول‌های بارگذاری‌شده: sys.modules

import sys, pprint
pprint.pprint(list(sys.modules.keys())[:10])  # نمایش 10 ماژول اول

sys.modules یک دیکشنری است که کلیدهای آن نام ماژول‌ها و مقدار آن‌ها آبجکت ماژول است. این ساختار پایه‌ای برای پیاده‌سازی mock در تست‌ها یا دستکاری بارگذاری ماژول‌هاست. احتیاط کنید: حذف یا تغییر ماژول‌ها در این دیکشنری می‌تواند به رفتار غیرمنتظره منجر شود.

اطلاعات نسخه و پلتفرم

import sys
print("Python:", sys.version)
print("Platform:", sys.platform)
print("Executable:", sys.executable)

این اطلاعات در اسکریپت‌های نصب، اسکریپت‌های تشخیصی (diagnostic) و هنگام گزارش باگ بسیار مفید است. sys.executable مسیر مفسر فعلی را نشان می‌دهد که در محیط‌های مجازی کمک‌کننده است.

کنترل عمق بازگشت (Recursion)

import sys

print("Default recursion limit:", sys.getrecursionlimit())
sys.setrecursionlimit(10000)

توابع بازگشتی عمیق ممکن است به تنظیم حد بازگشت نیاز داشته باشند. افزایش این مقدار می‌تواند از خطای RecursionError جلوگیری کند اما خطر سرریز پشته (stack overflow) را افزایش می‌دهد. فقط در صورت آگاهی کامل تغییر دهید.

کار با Exceptions: sys.exc_info()

import sys

try:
    1 / 0
except:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print("Exception type:", exc_type)
    print("Exception value:", exc_value)

sys.exc_info اطلاعات سه‌تایی درباره‌ی آخرین استثنایی که در بلوک try-except گرفته شده برمی‌گرداند. این برای لاگ‌گیری استک‌تریس و ارسال اطلاعات دقیق‌تر در ابزارهای مانیتورینگ مفید است.

نکات پیشرفته و بهترین‌شیوه‌ها

  • برای تغییر مسیرهای جستجو، در تولید از محیط‌های مجازی (venv) و تنظیم PYTHONPATH استفاده کنید تا دستکاری sys.path به حداقل برسد.
  • پیغام‌های کاربری را به stdout و خطاها را به stderr بفرستید؛ این کار ترکیب خروجی با لاگ را ساده‌تر می‌کند.
  • استفاده از sys.exit با کد مناسب به اسکریپت‌های شما امکان تعامل بهتر با ابزارهای shell و CI می‌دهد.
  • در تست‌ها برای جایگزینی موقت ماژول‌ها از ابزارهایی مانند unittest.mock استفاده کنید؛ دستکاری مستقیم sys.modules می‌تواند منجر به رفتارهای پیچیده شود.
  • پیش از افزایش recursionlimit، ساختار الگوریتم را بازبینی کنید؛ گاهی تبدیل بازگشت به حلقه (iteration) راه‌حل پایدارتر است.

جمع‌بندی و موارد قابل توجه

ماژول sys ابزار قدرتمندی برای تعامل با مفسر و محیط اجرای پایتون فراهم می‌کند. دانستن اعضای کلیدی آن (argv، stdin/stdout/stderr، path، modules، version و غیره) به شما امکان می‌دهد اسکریپت‌های قابل استفاده و قابل دیباگ بسازید. در عین حال، از تغییرات ناگهانی در ساختارهای داخلی مثل sys.modules یا sys.path با احتیاط استفاده کنید و همیشه به پیامدهای محیطی فکر کنید.

در صورت نیاز می‌توان مثال‌های بیشتری از کاربردهای پیشرفته (مثل لاگ‌گیری ساختاری، ابزارهای CLI با argparse ولی با کمک sys برای رفتارهای خاص، یا پرفورمنس‌تست با مشاهده sys.maxsize و byteorder) ارائه کرد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: