معرفی ماژول subprocess
در پایتون
ماژول subprocess
در پایتون برای اجرای دستورات سیستمعامل و ایجاد ارتباط با برنامههای خارجی استفاده میشود. این ماژول جایگزین مدرنتر و امنتر برای توابع قدیمی مانند os.system
و popen
است و امکان کنترل دقیق ورودی/خروجی فرآیندها را فراهم میکند.
اجرای ساده یک دستور
import subprocess
subprocess.run(["ls", "-l"])
تابع run()
رایجترین روش برای اجرای یک دستور خارجی است. آرگومانها باید به صورت لیستی از رشتهها داده شوند.
ذخیره خروجی دستور
result = subprocess.run(["echo", "Hello World"], capture_output=True, text=True)
print(result.stdout)
پارامتر capture_output=True
خروجی استاندارد و خطای استاندارد را ضبط میکند. استفاده از text=True
نیز باعث تبدیل خروجی به رشته (به جای بایت) میشود.
اجرای دستور با ورودی
proc = subprocess.run(["python3"], input="print('hi')", capture_output=True, text=True)
print(proc.stdout)
بررسی خطاها
try:
subprocess.run(["false"], check=True)
except subprocess.CalledProcessError as e:
print("Command failed:", e)
استفاده از check=True
باعث میشود اگر کد بازگشتی (exit code) غیر صفر باشد، خطا ایجاد شود.
اجرای دستورات پیچیده با shell
subprocess.run("echo $HOME", shell=True)
اگر نیاز به اجرای دستورات در یک محیط شِل باشد (مثلاً استفاده از متغیرهای محیطی یا pipe)، باید shell=True
استفاده شود. اما استفاده از این حالت ممکن است خطر امنیتی ایجاد کند، بهویژه با ورودیهای کاربر.
خواندن همزمان خروجی با Popen
from subprocess import Popen, PIPE
p = Popen(["echo", "hello"], stdout=PIPE)
out, _ = p.communicate()
print(out.decode())
کلاس Popen
برای کنترل دقیقتر فرآیندها استفاده میشود، از جمله خواندن یا نوشتن همزمان روی ورودی/خروجی.
جمعبندی
ماژول subprocess
امکان اجرای امن و کنترلشده دستورات خارجی را فراهم میکند. این ماژول قابلیتهایی مانند گرفتن خروجی، کنترل خطا، ارسال ورودی، و استفاده از شل را پشتیبانی میکند و برای اسکریپتهایی که نیاز به تعامل با سیستمعامل یا برنامههای دیگر دارند، ضروری است.