ویدیو آموزش ماژول subprocess پایتون

امیرحسین بیگدلو June 2023

ماژول subprocess پایتون به شما امکان می دهد در سطح کاملاً جدیدی با سیستم عامل تعامل داشته باشید. کامپیوتر ما همیشه فرآیندهای فرعی(subprocess) را اجرا می کند. در واقع، فقط با خواندن این مقاله، فرآیندهای(processes) زیادی مانند مدیر شبکه یا خود مرورگر اینترنت در حال اجرا هستند.

 

قبل از اینکه به سراغ ماژول subprocess پایتون برویم، بیایید ببینیم اصلا معنی subprocess چیست؟

 

دوره پیشنهادی: دوره آموزش رایگان پایتون

 

 #  درک مفهوم subprocess

به زبان ساده یک subprocess، یک پراسس است که توسط پراسس دیگری اجرا شده است. می‌توانیم یک پراسس فرعی را به‌عنوان یک درخت در نظر بگیریم که در آن هر پراسس والد دارای پراسس‌های فرزندی است که در پشت آن اجرا می‌شوند.

 

درک مفهوم پراسس

 

راه های مختلفی وجود دارد که می توانیم پراسس‌ های در حال اجرا در رایانه خود را ببینیم. به عنوان مثال، در یونیکس (لینوکس و مک) ابزار htop را داریم که یک نمایشگر فرآیند تعاملی است:

بررسی پراسس های در حال اجرا

 

در ویندوز هم میتوانید برای دیدن پراسس ها از ابزار task manager استفاده کنید:

بررسی فرایند های در حال اجرا ویندوز

 

ویدیو پیشنهادی: گرفتن ورودی از کاربر با متد input و ماژول getpass پایتون

 

 #  کتابخانه subprocess پایتون

یک subprocess در پایتون وظیفه ای است که اسکریپت پایتون به سیستم عامل (OS) واگذار می کند. کتابخانه subprocess به ما این امکان را می دهد که زیر فرآیندها را مستقیماً از پایتون اجرا و مدیریت کنیم. این شامل کار با ورودی استاندارد stdin، خروجی استاندارد stdout و کدهای بازگشتی است.

 

ما مجبور نیستیم آن را با PIP نصب کنیم، زیرا بخشی از کتابخانه استاندارد پایتون است. بنابراین می‌توانیم با وارد کردن ماژول، از subprocess در پایتون استفاده کنیم:

import subprocess

# Using the module ....

 

 

برای کار با پراسس ها باید از متد run استفاده کنید. این متد در پایتون 3.5 به این ماژول اضافه شد. تمام دستوراتی که در این متد استفاده میکنید باید برای سیستم عامل قابل فهم باشد. متد run دستور وارد شده را اجرا کرده و تا زمان اتمام دستور، مفسر پایتون را منتظر نگه میدارد.

 

در مثال زیر با استفاده از دستور ls لینوکس محتویات دایرکتوری فعلی را دریافت میکنیم. اگر ویندوز دارید از dir استفاده کنید:

import subprocess 

subprocess.run('ls')


# OUTPUT
one.py
venv
two.py

 

اگر دستوری که میخواهید اجرا کنید، چند بخشی است باید آپشن shell را True قرار دهید. که به معنی اجرای دستور مستقیما توسط shell سیستم عامل است:

import subprocess

subprocess.run('ls -l', shell=True)

# OUTPUT
total 16
-rw-rw-r-- 1 amir amir    0 Dec 16 15:11 four.py
drwxrwxr-x 2 amir amir 4096 Jan  1 12:59 __pycache__
-rw-rw-r-- 1 amir amir   92 Jan  1 12:59 three.py
-rw-rw-rw- 1 amir amir   76 Jan 26 18:00 two.py
drwxrwxr-x 6 amir amir 4096 Aug 12 19:12 venv

 

اما استفاده از shell به دلیل داشتن مشکلات امنیتی پیشنهاد نمیشود. بهترین روش ارسال دستورات چند بخشی به شکل یک لیست است:

subprocess.run(['ls', '-l'])

 

اگر بخواهید خروجی دستور را در یک متغیر ذخیره کنید، میتوانید از گزینه capture_output استفاده کنید:

result = subprocess.run(['ls', '-l'], capture_output=True)
print(result.stdout)

# OUTPUT
b'total 16\n-rw-rw-r-- 1 amir amir    0 Dec 16 15:11 four.py\ndrwxrwxr-x 2 amir amir 4096 Jan  1 12:59 __pycache__\n-rw-rw-r-- 1 amir amir   92 Jan  1 12:59 three.py\n-rw-rw-rw- 1 amir amir  120 Jan 26 18:03 two.py\ndrwxrwxr-x 6 amir amir 4096 Aug 12 19:12 venv\n'

 

برای دسترسی به مقدار خروجی است stdout استفاده میکنیم. در این حالت خروجی دستور به شکل byte ذخیره شده و اگر بخواهید به شکل string ذخیره کنید، میتوانید از گزینه text استفاده کنید:

result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)

# OUTPUT
total 16
-rw-rw-r-- 1 amir amir    0 Dec 16 15:11 four.py
drwxrwxr-x 2 amir amir 4096 Jan  1 12:59 __pycache__
-rw-rw-r-- 1 amir amir   92 Jan  1 12:59 three.py
-rw-rw-rw- 1 amir amir  131 Jan 26 18:06 two.py
drwxrwxr-x 6 amir amir 4096 Aug 12 19:12 venv

 

 

ویدیوهای مشابه



ارسال نظر


زهرا

10 ماه قبل پاسخ به نظر

عالی بود

ارسال نظر



Md

2 سال قبل پاسخ به نظر

سلام، یه متدی داخل ساب پراسس هست به اسم call . میخواستم بدونم فرق subprocess.call و subprocess.run چیه؟

ارسال نظر



امیرحسین بیگدلو

2 سال قبل

سلام
متد call جزو متدهای قدیمی این ماژول هستش و مشابه run هست. الآن دیگه پیشنهاد میشه از run استفاده کنید

مونگارد