recent
أخبار ساخنة

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

AM VIIP
الصفحة الرئيسية
مكتبة 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 الآن لنرى النتيجة

stdout 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
google-playkhamsatmostaqltradent