كيفية استخدام مكتبة subprocess لتنفيذ أوامر النظام في Python
تمت الكتابة بواسطة: عبد الحكيم
تارخ آخر تحديث: 19 ديسمبر 2024محتوى المقال
- مقدمة حول مكتبة subprocess
- تنفيذ أمر بسيط باستخدام subprocess.run
- التعامل مع المخرجات باستخدام subprocess.run
- التعامل مع الأخطاء
- التعامل مع المدخلات والمخرجات القياسية
- استخدام subprocess.Popen للتنفيذ المتقدم
- الخلاصة
تعد مكتبة 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()
، يمكنك التحكم الكامل في كيفية تشغيل الأوامر ومعالجة نتائجها.
طور مهاراتك: مقالات يجب قراءتها في البرمجة
- كيفية استخدام مكتبة PyGame لتطوير الألعاب في Python
- كتابة سكربت لتحميل الملفات من الإنترنت باستخدام urllib في Python
- كيفية إنشاء قنوات اتصال باستخدام مكتبة asyncio.Queue في Python
- كيفية استخدام مكتبة boto3 للتفاعل مع خدمات AWS في Python
- كيفية إدارة وتحليل البيانات باستخدام مكتبة Dask في Python
- كيفية التعامل مع ملفات الصوت باستخدام مكتبة pydub في Python
- كيفية إنشاء خريطة موقع Sitemap XML
- كيفية تقسيم النصوص باستخدام دالة split() في Python
- كيفية دمج النصوص باستخدام دالة join() في Python
- البحث عن عناصر معينة في القوائم باستخدام دالة index() في Python