التعرف على مكتبة subprocess في بايثون - ProgrammerTech
Language:

Search

التعرف على مكتبة subprocess في بايثون

  • Share this:
التعرف على مكتبة subprocess في بايثون

مكتبة subprocess في بايثون

مكتبة subprocess هي مكتبة موجودة لدينا في بايثون تُمكننا من التعامل مع سطر الأوامر command line لرؤية stdout و stderr وهي مهمة جداً جداً و سوف نتعامل معها في السكيورتي و في الشبكات.

 

إظهار النتائج والأخطاء subprocess

سوف نستخدم الآن وظيفة تُتيح لنا إظهار النتائج و الأخطاء في حال إن وجدت و المدخلات بشكل تفصيلي أكثر.

 

مثال 1

ننشئ ملف بايثون مثلاً على سطح المكتب بإسم subprocess_.py ونكتب بداخله

from subprocess import PIPE , Popen
p = Popen  ("tasklist",stdout=PIPE,stderr=PIPE,shell=True)
print(p.communicate()[0])

قلنا في المثال أنه لدينا process و إستخدمنا به Popen و أخذ مننا بعض الأرجيومنت و أولها tasklist الذي هو موجود لدينا ضمن النظام و ثانياً stdout و ثالثاً الخطأ stderr إذا وجد خطأ و الـ shell يساوي True ,وهذه من الأساسيات في الـ process ,و بعدها لرؤية النتيجة إستخدمنا p.communicate سوف يعرض لنا Tuple عنصرين لا اكثر , الاول stdout ,و الثاني stderr .

نشغل الامر بـ cmd الآن لنرى النتيجة

subprocess library python

 

اما إذا إستخدمنا أمر غير موجود لدينا في النظام كالتالي

from subprocess import PIPE , Popen
p = Popen  ("tasklist",stdout=PIPE,stderr=PIPE,shell=True)
print(p.communicate()[0])

عند التشغيل لن يعرض لنا اي شيئ لأن الأمر غير موجود, و إذا نريد عرض الرساله غير موجود نستخدم نغير بدل الـ 0 نضعها 1 لعرض الاخطاء كالتالي

from subprocess import PIPE , Popen
p = Popen  ("lskd",stdout=PIPE,stderr=PIPE,shell=True)
print(p.communicate()[1])

سيعطينا النتيجة التالية

subprocess python

 

إذا نريد أن تعرض النتيجة بشكل منتظَّم نستخدم كالتالي بملفنا

from subprocess import PIPE , Popen
p = Popen  ("tasklist",stdout=PIPE,stderr=PIPE,shell=True)
print(p.communicate()[0].decode("utf-8"))

ستكون النتيجة نفسها لكن بشكل مرتب.

مثال 2
process_1 = subprocess.Popen(['ls','-al'],stdin = subprocess.PIPE,
    stdout = subprocess.PIPE,
    stderr = subprocess.PIPE, shell = True)
output , error = process_1.communicate()
print(output)
print(error)

و المخرجات سوف تكون كالتالي:

b'_test_runner.py\nmain.py\nout.txt\n'
b''

 إن كل عملية لا بُد من مُدخلات و مخرجات و أخطاء في حال وجودها لكي نقوم بحصر المخرجات و الأخطاء قمنا بإضافة ما يلي:

stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE

و ذلك لأجل تفعيل عملية الحصر من داخل الدالة تقوم الدالة  ()communicate في فرز المخرجات و الأخطاء في متغيرات للإستفادة منها و عرضها:

output , error = process_1.communicate()
print(output)
print(error)

لنأخذ ما تعلمناه و نوجه مخرجاتنا لملف.

import subprocess
fout = open('out.txt','w+')
process_1 = subprocess.Popen(['ls','-al'],stdin = subprocess.PIPE,
import subprocess
fout = open('out.txt','w+')
process_1 = subprocess.Popen(['ls','-al'],stdin = subprocess.PIPE,
    stdout = fout,
    stderr = subprocess.PIPE, shell = True)
output , error = process_1.communicate()
print(output)
print(error
    stdout = fout,
    stderr = subprocess.PIPE, shell = True)
output , error = process_1.communicate()
print(output)
print(error)

كما نلاحظ أننا بعد أن قمنا بإنشاء ملف و وضعيته هي القراءة و الكتابة و قُمنا بتوجيه المخرجات من الأمر إلى الملف:

stdout = fout

و نقوم بفتح الملف out.txt و عرض محتوياته سوف نجد أن محتويات المخرجات تم توجيهها و كتابتها فيه:

_test_runner.py
main.py
out.txt

Tags:
Muhammad Alush

Muhammad Alush

إسمي محمد تركي العلوش من سورية من ريف حلب الشرقي 1994, محب للتقنية و التعلم الذاتي, و جميع خبراتي تعلمتها ذاتياً, و اللغات البرمجية التي أتقنها هي html, css, javascript, php, c, python بالإضافة إلى حبي الكبير لمجال الشبكات.

موقعي programmer-tech.com