كيفية استخدام مكتبة subprocess لتنفيذ أوامر النظام في Python

تمت الكتابة بواسطة: adel

تارخ آخر تحديث: 21 نوفمبر 2024

محتوى المقال

كيفية استخدام مكتبة subprocess لتنفيذ أوامر النظام في Python

تعد مكتبة subprocess واحدة من أقوى المكتبات المدمجة في لغة البرمجة Python، حيث تسمح بتنفيذ أوامر النظام مباشرة من داخل كود Python. تستخدم هذه المكتبة عادة لتنفيذ الأوامر، قراءة المخرجات، والتعامل مع الأخطاء التي قد تحدث أثناء التنفيذ. في هذا المقال، سنستعرض كيفية استخدام subprocess لتنفيذ أوامر النظام مع شرح مفصل وأمثلة توضيحية.

مقدمة حول مكتبة subprocess

قبل إصدار Python 3.5، كان يتم استخدام عدة مكتبات لتنفيذ أوامر النظام، مثل os.system و os.spawn*. لكن مع تطوير subprocess، أصبح بالإمكان تنفيذ أوامر النظام والتعامل مع مخرجاتها بشكل أكثر أمانًا ومرونة. هذه المكتبة توفر وظائف متعددة لتشغيل الأوامر وقراءة نتائجها، كما تتيح لك التحكم الكامل في كيفية التعامل مع المدخلات والمخرجات.

تنفيذ أمر بسيط باستخدام subprocess.run

الدالة subprocess.run() هي الطريقة الأكثر شيوعًا لتنفيذ أمر نظام بسيط. تقوم هذه الدالة بتنفيذ الأمر وتنتظر حتى ينتهي. في حالة نجاح التنفيذ، تعود الدالة بكائن يحتوي على تفاصيل حول الأمر الذي تم تنفيذه.

مثال على تنفيذ أمر بسيط

لنفترض أنك تريد تنفيذ أمر ls في نظام تشغيل Unix لعرض قائمة الملفات في المجلد الحالي:

import subprocess

subprocess.run(['ls', '-l'])

في هذا المثال، سيتم تنفيذ الأمر ls -l وسيتم عرض النتائج مباشرة في مخرجات الكود.

التعامل مع المخرجات باستخدام subprocess.run

في بعض الأحيان، تحتاج إلى قراءة مخرجات الأمر بدلاً من عرضها مباشرة. يمكنك القيام بذلك عن طريق ضبط المعامل capture_output=True:

import subprocess

result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

print(result.stdout)

هنا، يتم تخزين مخرجات الأمر في المتغير result.stdout ويمكنك استخدام print() لعرضها أو معالجتها حسب الحاجة.

التعامل مع الأخطاء

في بعض الحالات، قد يفشل الأمر في التنفيذ وتحتاج إلى التعامل مع الخطأ. subprocess.run() يعيد استثناءً في حال فشل الأمر، لكن يمكنك تحديد المعامل check=True لجعل الدالة ترفع استثناء subprocess.CalledProcessError عند فشل التنفيذ:

import subprocess

try:
  result = subprocess.run(['ls', 'non_existent_file'], check=True, capture_output=True, text=True)
except subprocess.CalledProcessError as e:
  print("Error occurred:", e)

في هذا المثال، يحاول البرنامج تنفيذ أمر يعرض ملفًا غير موجود، وبالتالي سيتم رفع استثناء وإخباره بحدوث خطأ.

التعامل مع المدخلات والمخرجات القياسية

مكتبة subprocess تتيح لك التحكم الكامل في المدخلات والمخرجات القياسية. على سبيل المثال، يمكنك تمرير بيانات إلى العملية من خلال stdin وقراءة المخرجات من خلال stdout:

مثال على تمرير المدخلات

لنأخذ مثالًا على تمرير نص إلى أمر grep الذي يبحث عن سلسلة نصية معينة:

import subprocess

process = subprocess.run(['grep', 'hello'],
  input='hello world\nhello python\nhi there',
  capture_output=True, text=True)

print(process.stdout)

في هذا المثال، يتم تمرير سلسلة نصية إلى grep للبحث عن كلمة hello، وستظهر النتائج التي تحتوي على الكلمة.

استخدام subprocess.Popen للتنفيذ المتقدم

للتنفيذ المتقدم والتحكم الأفضل في العمليات، يمكنك استخدام subprocess.Popen. تتيح لك هذه الدالة تنفيذ الأوامر بشكل غير متزامن، وتوفر لك تحكمًا أكبر في تدفق البيانات.

مثال على استخدام Popen

لنفترض أنك تريد تشغيل أمر والقراءة من stdout أثناء تنفيذ الأمر:

import subprocess

process = subprocess.Popen(['ls', '-l'],
  stdout=subprocess.PIPE,
  stderr=subprocess.PIPE,
  text=True)

stdout, stderr = process.communicate()
print(stdout)

في هذا المثال، يتم تشغيل الأمر بشكل غير متزامن ويمكنك قراءة المخرجات من stdout مباشرة.

الخلاصة

تعتبر مكتبة subprocess أداة قوية لتنفيذ أوامر النظام من داخل Python، مما يتيح للمطورين تنفيذ الأوامر ومعالجة المخرجات بطريقة مرنة وآمنة. سواء كنت بحاجة إلى تنفيذ أوامر بسيطة أو التعامل مع عمليات معقدة، توفر subprocess مجموعة واسعة من الوظائف لتلبية احتياجاتك. من خلال استخدام الدوال run() و Popen()، يمكنك التحكم الكامل في كيفية تشغيل الأوامر ومعالجة نتائجها.

طور مهاراتك: مقالات يجب قراءتها في البرمجة