التعرف على مكتبة subprocess في بايثون 16 - Programmer Tech
Python Programming

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

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

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

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

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

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

مثال 1

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

!#/usr/bin/python
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

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

!#/usr/bin/python
from subprocess import PIPE , Popen
p = Popen  ("tasklist",stdout=PIPE,stderr=PIPE,shell=True)
print(p.communicate()[0])

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

!#/usr/bin/python
from subprocess import PIPE , Popen
p = Popen  ("lskd",stdout=PIPE,stderr=PIPE,shell=True)
print(p.communicate()[1])

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

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

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

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

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

مثال 2

!#/usr/bin/python
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)

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

!#/usr/bin/python
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

Ahmedkaissar

من مصر من محافظة الجيزة مبرمج ويب و خبير أمن معلومات محب للتقنية و الأمن المعلوماتي مدرب للغات "Python,html, css, php, js, laravel"
زر الذهاب إلى الأعلى