كيفية كتابة سكربت لتشغيل أوامر النظام في Python

تمت الكتابة بواسطة: عبد الحكيم

تارخ آخر تحديث: 19 ديسمبر 2024

محتوى المقال

كيفية كتابة سكربت لتشغيل أوامر النظام في Python

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

لماذا نستخدم Python لتشغيل أوامر النظام؟

استخدام Python لتشغيل أوامر النظام يوفر لك واجهة برمجية سهلة وقابلة للتوسيع للتفاعل مع النظام الأساسي. يمكنك من خلال Python تشغيل أوامر بسيطة مثل ls أو dir، أو تشغيل عمليات معقدة والتحكم بمخرجاتها.

مقدمة عن مكتبة subprocess

مكتبة subprocess هي المكتبة الموصى بها في Python لتشغيل أوامر النظام وإنشاء عمليات فرعية. تحل هذه المكتبة محل دوال قديمة مثل os.system() وتوفر وظائف أكثر قوة ومرونة.

تشغيل أوامر بسيطة باستخدام subprocess.run()

للبدء، يمكنك استخدام subprocess.run() لتشغيل أمر بسيط. سنقوم بتشغيل أمر يعرض قائمة الملفات في دليل معين:

import subprocess

# تشغيل أمر ls لعرض الملفات في الدليل الحالي
subprocess.run(['ls'])

في المثال أعلاه، نقوم بتشغيل الأمر ls على الأنظمة التي تستخدم UNIX لعرض قائمة الملفات في الدليل الحالي. إذا كنت تعمل على نظام Windows، يمكنك استخدام dir بدلاً من ls:

# تشغيل أمر dir لعرض الملفات في الدليل الحالي على Windows
subprocess.run(['dir'], shell=True)

لاحظ أنه في نظام Windows، نحتاج إلى استخدام المعامل shell=True لتشغيل الأمر داخل بيئة shell.

التعامل مع مخرجات الأوامر

في بعض الأحيان، قد تحتاج إلى التعامل مع مخرجات الأوامر، مثل قراءة نتائج الأمر أو تسجيلها في ملف. يمكنك استخدام المعامل capture_output=True لجمع المخرجات:

# تشغيل أمر ls وجمع المخرجات
result = subprocess.run(['ls'], capture_output=True, text=True)

# عرض المخرجات
print(result.stdout)

في هذا المثال، يتم جمع المخرجات من خلال stdout وعرضها. إذا كان هناك أي خطأ في التنفيذ، يمكنك الوصول إلى الخطأ عبر stderr.

تشغيل الأوامر باستخدام subprocess.Popen

بالإضافة إلى subprocess.run()، توفر مكتبة subprocess دالة Popen التي تمنحك تحكمًا أكبر عند تشغيل الأوامر. باستخدام Popen، يمكنك تشغيل الأوامر بشكل غير متزامن، التحكم في الإدخال والإخراج، وأكثر.

تشغيل أمر غير متزامن

لتشغيل أمر غير متزامن، يمكنك استخدام Popen كالتالي:

from subprocess import Popen

# تشغيل أمر غير متزامن
process = Popen(['sleep', '5'])
# متابعة تنفيذ باقي السكربت
print("الأمر يعمل في الخلفية")

في هذا المثال، يتم تشغيل أمر sleep 5 بشكل غير متزامن، مما يسمح للسكربت بالار في التنفيذ دون انتظار اكتمال الأمر.

التعامل مع الإدخال والإخراج

يمكنك أيضًا استخدام Popen للتعامل مع الإدخال والإخراج بشكل متزامن. في المثال التالي، سنقوم بإرسال بيانات إلى أمر grep ثم نقرأ المخرجات:

from subprocess import Popen, PIPE

# تشغيل أمر grep
process = Popen(['grep', 'python'], stdin=PIPE, stdout=PIPE, stderr=PIPE, text=True)

# إرسال البيانات إلى stdin
stdout, stderr = process.communicate("python is great\npython is powerful\njava is also good")

# عرض المخرجات
print(stdout)

في هذا المثال، يتم إرسال نص إلى أمر grep والذي يبحث عن الأسطر التي تحتوي على كلمة "python" ثم يقوم بعرضها.

تشغيل أوامر النظام مع إدارة الأخطاء

من المهم التعامل مع الأخطاء المحتملة عند تشغيل أوامر النظام. يمكنك استخدام try-except لإدارة الأخطاء والتعامل معها بشكل مناسب.

مثال على إدارة الأخطاء

لنقم بكتابة سكربت يقوم بتشغيل أمر وإدارة الأخطاء الناتجة إذا فشل الأمر:

import subprocess
try:
    # محاولة تشغيل أمر غير صحيح
    subprocess.run(['non_existent_command'], check=True)
except subprocess.CalledProcessError as e:
    # التعامل مع الخطأ
    print("حدث خطأ أثناء تنفيذ الأمر:", e)

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

دمج الأوامر المتعددة

في بعض الحالات، قد تحتاج إلى دمج أوامر متعددة معًا (مثل استخدام pipes). يمكنك تحقيق ذلك في Python باستخدام subprocess.Popen:

مثال على دمج الأوامر باستخدام pipes

لنقم بدمج أوامر ls و grep للبحث عن ملفات معينة في الدليل الحالي:

import subprocess

# تشغيل الأمر ls وتمريره إلى grep
p1 = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', 'txt'], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()

# الحصول على المخرجات
output, err = p2.communicate()
print(output.decode())

في هذا المثال، نقوم بتشغيل ls وتمرير مخرجاته إلى grep للبحث عن الملفات التي تحتوي على الامتداد "txt".

خاتمة

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

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