مكتبة 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 الآن لنرى النتيجة
اما إذا إستخدمنا أمر غير موجود لدينا في النظام كالتالي
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])
سيعطينا النتيجة التالية
إذا نريد أن تعرض النتيجة بشكل منتظَّم نستخدم كالتالي بملفنا
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