-- title: مدیریت پردازشهای سیستم (Subprocess) slug: python-subprocess description: راهنمای جامع اجرای دستورات سیستمعامل و مدیریت پردازشها با ماژول Subprocess در پایتون. date: 1404/10/21 order: 52
سطح مقدماتی (Beginner Level)
در برنامهنویسی پایتون، گاهی نیاز داریم که دستورات سیستمعامل (مانند ls در لینوکس یا dir در ویندوز) را اجرا کنیم یا یک برنامه دیگر را از داخل اسکریپت خود صدا بزنیم. در گذشته از os.system استفاده میشد، اما ماژول استاندارد و قدرتمند subprocess جایگزین آن شده است.
این ماژول به شما اجازه میدهد پردازشهای جدید (New Processes) ایجاد کنید، به ورودی/خروجی آنها متصل شوید و کدهای بازگشتی (Return Codes) آنها را دریافت کنید.
تابع subprocess.run
سادهترین و پیشنهادیترین روش برای اجرای دستورات، استفاده از تابع run است. این تابع دستور را اجرا میکند و منتظر میماند تا تمام شود.
برای استفاده از آن، آرگومانها را به صورت یک لیست (List) به آن میدهیم. این کار امنیت برنامه را بالا میبرد.
بررسی موفقیت دستور
هر دستور در سیستمعامل پس از اجرا یک "کد بازگشتی" (Return Code) دارد. عدد 0 معمولاً به معنای موفقیت است. تابع run یک شیء CompletedProcess برمیگرداند که حاوی این کد است.
# Example 2: Checking return code (Static - Logic demonstration)
import subprocess
# اجرای دستور (مثلا لیست کردن فایلها)
# در لینوکس/مک: ["ls", "-l"]
# در ویندوز: ["cmd", "/c", "dir"]
result = subprocess.run(["echo", "Hello World"], capture_output=False)
if result.returncode == 0:
print("Command executed successfully!")
else:
print("Something went wrong.")
سطح پیشرفته (Professional Level)
در سطح حرفهای، ما نیاز به کنترل دقیقتری روی ورودی و خروجیها (Standard Input/Output/Error) داریم. همچنین مدیریت خطاها و تعامل با پردازشهای طولانی از مباحث مهم است.
دریافت خروجی (Capturing Output)
به طور پیشفرض، subprocess.run خروجی را مستقیماً در کنسول چاپ میکند. اگر بخواهیم خروجی را در یک متغیر ذخیره کنیم (مثلاً برای پردازش متن آن)، باید از آرگومان capture_output=True و text=True استفاده کنیم.
capture_output=True: خروجی استاندارد و خطا را ضبط میکند.text=True: خروجی را به صورت رشته (String) برمیگرداند (به جای بایت).
مدیریت خطاها (Error Handling)
اگر دستوری با خطا مواجه شود، پایتون به طور پیشفرض برنامه را متوقف نمیکند. برای اینکه در صورت خرابی دستور، پایتون یک Exception پرتاب کند، باید از check=True استفاده کنیم.
# Advanced Example 2: Raising exceptions on failure
import subprocess
try:
# تلاش برای اجرای دستوری که وجود ندارد
subprocess.run(["this_command_does_not_exist"], check=True)
except FileNotFoundError:
print("Error: The command was not found.")
except subprocess.CalledProcessError as e:
print(f"Error: Command failed with return code {e.returncode}")
استفاده از کلاس Popen (سطح پایین)
برای کارهای بسیار پیچیده که نیاز به تعامل زنده (Real-time) با پردازش دارید (مثلاً فرستادن ورودی در حین اجرا)، subprocess.run کافی نیست و باید از کلاس Popen استفاده کنید. این کلاس غیرمسدودکننده (Non-blocking) است، مگر اینکه متد wait() یا communicate() صدا زده شود.
نکته امنیتی: هرگز از shell=True به همراه ورودیهای کاربر استفاده نکنید، زیرا برنامه شما را در معرض حملات "Shell Injection" قرار میدهد.