انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: آموزش و بحث در مورد ماژول subprocess  (دفعات بازدید: 4067 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
آموزش و بحث در مورد ماژول subprocess
« : 13 امرداد 1392، 09:13 ق‌ظ »
سلام دوستان

در این تاپیک می خواهیم با هم دیگه کمی در مورد ماژول subprocess بحث کنیم.  \\:D/

=> از این ماژول در زبان پایتون استفاده می شه.

من مطالبی که در مورد این ماژول بلدم رو می نویسم و شما هم اشکالات و سوالات خودتون رو مطرح کنید من هم تا جایی که بلدم در خدمتتونم.

اگر در مطالب هم اشکالی پیدا کردید اطلاع بدید. و پیشاپیش ممنونم از همه کسانی که در این تاپیک با من همکاری خواهند کرد.  ;)
« آخرین ویرایش: 13 امرداد 1392، 09:16 ق‌ظ توسط myamin »
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
پاسخ : آموزش و بحث در مورد ماژول subprocess
« پاسخ #1 : 13 امرداد 1392، 09:20 ق‌ظ »
ماژول subprocess شامل انواع زیادی از توابع برای ران کردن کامند ها می باشد و یک کلاس بنام Popen دارد که تمام این توابع از همین کلاس درست شده اند. حتی تابع system در ماژول os نیز از این کلاس درست شده.

نکته: بعضی از توابع فقط در ورژن 3 پایتون وجود دارند و بهمین خاطر اگر ورژن پایتون شما 2 هست این توابع رو نمی تونید اجرا کنید. من در پایان این توابع می نویسم که فقط در ورژن 3 وجود دارند.

>>> Let's start ;)
0. تابع
subprocess.getstatusoutput(cmd)

این تابع کد رو با استفاده از os.popen اجرا میکنه و خروجی اش یه تاپل 2 تایی (status, output) می باشد.
در اندیس اول status و در اندیس دوم خروجی (output) مربوط به اجرا کردن کد رو قرار میده.

اگر کد ما درست در shell اجرا بشه که status برابر 0 میشه وگرنه کد مربوط به خطا رو در status قرار میده.

Example:
>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> subprocess.getstatusoutput('cat /bin/junk')
(256, 'cat: /bin/junk: No such file or directory')


این تابع در unix قابل استفاده هست.

این تابع در ورژن 3 پایتون قابل استفاده هست.

Good luck
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
پاسخ : آموزش و بحث در مورد ماژول subprocess
« پاسخ #2 : 14 امرداد 1392، 01:55 ق‌ظ »
سلام دوستان

1. تابع
subprocess.getoutput(cmd)
این تابع کد ما رو در shell اجرا کرده و خروجی (stdout و stderr) را برگشت می ده.

شبیه  subprocess.getstatusoutput بجز اینکه status رو برنمی گردونه و خروجی اش رشته می باشد.

Example:
>>> subprocess.getoutput('ls /bin/ls')
'/bin/ls'

در unix قابل استقاده است.
این تابع در ورژن 3 پایتون قابل استفاده هست.

نکته: دو تابع معرفی شده در بالا ( getoutput و getstatusoutput ) خروجی رو چاپ نمی کنند بلکه انرو برمیگردونند.

Good Luck
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
پاسخ : آموزش و بحث در مورد ماژول subprocess
« پاسخ #3 : 14 امرداد 1392، 07:40 ق‌ظ »
سلام دوستان  :)

2. تابع
subprocess.call
پارامترهای این تابع مثل Popen هست ( بعداً به Popen  می رسیم ).

کل کد این تابع دو خط هست:

Code:def call(*popenargs, **kwargs):
      return Popen(*popenargs, **kwargs).wait()

تنها فرقش با Popen متد wait هست که با این متد تابع call صبر می کند تا کد ما کامل اجرا شود بعد نتیجه رو چاپ می کنه البته همراه با status.

status رو برمی گردونه( return ).

Example:
subprocess.call(["ls", "-l"])
Output:
>>> subprocess.call(["ls", "-l"])
total 24
-rw-rw-rw- 1 root root 2567 2013-07-31 04:57 converter.py
-rw-r--r-- 1 root root  196 2013-07-26 02:50 main.pyo
-rwx------ 1 root root  185 2013-08-03 23:10 subprocess_call01.py
-rwx------ 1 root root  165 2013-08-03 23:39 subprocess_call02.py
-rw-r--r-- 1 root root 1179 2013-07-27 05:10 test1.py
-rw-r--r-- 1 root root 1594 2013-08-03 23:39 test.txt
0

Good Luck
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
پاسخ : آموزش و بحث در مورد ماژول subprocess
« پاسخ #4 : 15 امرداد 1392، 06:08 ق‌ظ »
مثال های دیگری از subprocess.call:

1.
Code:
import subprocess
print('About to run ls.')
subprocess.call(['ls', '-l'])
print('Finished running ls.')

Output:
$ python3 example01.py
About to run ls.
total 16
-rw-rw-rw- 1 root root 2567 2013-07-31 04:57 converter.py
-rw-r--r-- 1 root root  196 2013-07-26 02:50 main.pyo
-rwx------ 1 root root  185 2013-08-03 23:10 subprocess_call01.py
-rw-r--r-- 1 root root 1179 2013-07-27 05:10 test1.py
Finished running ls.

در این مثال ابتدا عبارت
About to run ls. چاپ می شود و بعد خروجی کامند اجرا شده و در اخر عبارت
Finished running ls.
نتیجه:
در یک برنامه هر وقت به این تابع رسیدیم همانطور که قبلا هم گفته شد برنامه ما منتظر می ماند تا کد ما کامل اجرا بشه بعدش هم ادامه برنامه.

[و این داستان] ادامه دارد...

Good Luck
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
پاسخ : آموزش و بحث در مورد ماژول subprocess
« پاسخ #5 : 19 امرداد 1392، 01:43 ق‌ظ »

2. در این مثال status برنامه نشون داده میشه.

Code:import subprocess
print('About to run ls.')
rc = subprocess.call(['ls', '-l'])
print('Finished running ls.')
print('RC = {:d}'.format(rc))

Output:
About to run ls.
total 32
-rw-r--r-- 1 tester tester 2567 2013-08-02 05:50 converter.py
-rw-r--r-- 1 tester tester  196 2013-08-02 05:50 main.pyo
-rwx------ 1 tester tester  183 2013-08-02 05:50 subprocess_call01.py
-rwxr--r-- 1 tester tester  217 2013-08-02 06:40 subprocess_call02.py
-rwx------ 1 tester tester  160 2013-08-04 02:05 subprocess_call03.py
-rwxr--r-- 1 tester tester  118 2013-08-02 06:36 subprocess_popen01.py
-rwxr--r-- 1 tester tester  133 2013-08-02 06:49 subprocess_popen02.py
-rw-r--r-- 1 tester tester 1179 2013-08-02 05:50 test1.py
Finished running ls.
RC = 0

status رو در متغییر rc می گذاریم و بعد هم می تونیم از این متغییر برای فهمیدن status استفاده کنیم که در این مثال این مقدار چاپ شده.

پس status به این شکل قابل نمایش است.
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
پاسخ : آموزش و بحث در مورد ماژول subprocess
« پاسخ #6 : 21 امرداد 1392، 04:07 ق‌ظ »
سلام دوستان

در صورتی که نمی خواهید خروجی تولید شده نمایش داده شود میتونید خروجی رو در یک فایل بریزید.

شل یه عملگر به این شکل > که خروجی استاندارد رو یک فایل قرار میده.

در ماژول subprocess نیز همچنین کاری رو می شه انجام داد.

Example:
import subprocess
print('About to run ls.')
ls_output = open('ls_out.txt', 'w')
rc = subprocess.call(['ls', '-l'], stdout=ls_output)
ls_output.close()
print('Finished running ls.')
print("RC = {0:d}".format(rc))

Output:
About to run ls.
Finished running ls.
RC = 0

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

این روش پایتون جهت هدایت خروجی به یک فایل هست.

Good Luck
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *