ما هي مكتبة Sh
في العديد من مشاريع بايثون، تحتاج إلى استدعاء أوامر shell: إدارة الملفات، تشغيل عمليات النظام، التفاعل مع أدوات CLI المثبتة. يمكنك استخدام os.system أو subprocess، لكنها معقدة وتتطلب معالجة يدوية للوسائط والأخطاء والمخرجات.
توفر مكتبة Sh طريقة نظيفة ومكتوبة بأسلوب بايثون لاستدعاء أوامر shell كدوال بايثون عادية. إنها تبسط بشكل كبير دمج الأدوات الخارجية، وتجعل الكود قابلاً للقراءة وسهل التصحيح.
مزايا استخدام Sh
تتمتع مكتبة Sh بالعديد من المزايا الهامة مقارنة بالطرق القياسية لتنفيذ أوامر النظام:
سهولة القراءة وبساطة التركيب - تبدو الأوامر كدوال بايثون عادية، مما يجعل الكود أكثر وضوحاً وقابلية للصيانة.
إدارة تلقائية للأخطاء - تتعامل المكتبة تلقائياً مع رموز الإرجاع وتطرح استثناءات عند حدوث أخطاء.
الأمان - حماية من حقن الأوامر بفضل الهروب الصحيح للوسائط.
المرونة - دعم الأنابيب (pipelines)، التنفيذ في الخلفية، الإدخال/الإخراج المتدفق، والعديد من الإمكانيات الأخرى.
التثبيت والاستيراد
يتم تثبيت المكتبة عبر pip:
pip install sh
لاستيرادها في الكود، يكفي سطر واحد:
import sh
مبادئ العمل الأساسية
تقوم Sh تلقائياً بتعيين اسم أي أمر shell إلى دالة بايثون. هذا يسمح باستخدامها بطريقة طبيعية:
print(sh.ls("-l"))
كل استدعاء يُرجع كائنًا يحتوي على stdout، والذي يمكن تحويله إلى نص، قائمة نصوص، بايتات، وصيغ أخرى.
الاستخدام الأساسي
التعامل مع الملفات
# عرض قائمة الملفات
print(sh.ls("-lah"))
# إنشاء ملف
sh.touch("file.txt")
# نسخ ملف
sh.cp("file.txt", "copy.txt")
# حذف ملف
sh.rm("copy.txt")
# إنشاء مجلد
sh.mkdir("test_dir")
# نقل ملف
sh.mv("file.txt", "test_dir/")
التعامل مع النصوص
# عرض محتوى ملف
content = sh.cat("file.txt")
print(str(content))
# البحث في الملفات
matches = sh.grep("python", "*.py")
for match in matches:
print(match.strip())
# عد الأسطر
line_count = sh.wc("-l", "file.txt")
print(f"عدد الأسطر: {line_count.strip()}")
التعامل مع الوسائط والخيارات
تدعم Sh طرقاً مختلفة لتمرير وسائط الأوامر:
الوسائط الموضعية
sh.ls("--color", "auto", "/home/user")
الوسائط المسماة
# الخيارات الطويلة
sh.ls(color="auto", all=True, human_readable=True)
# الخيارات القصيرة
sh.ls(a=True, l=True, h=True)
النهج المدمج
# استخدام مختلط
sh.find("/home", name="*.py", type="f")
معالجة مخرجات الأوامر
الحصول على النتيجة كنص
output = sh.ls()
print(str(output))
المعالجة سطراً سطراً
for line in output:
print(line.strip())
التعامل مع البايتات
raw_output = sh.ls()
bytes_data = raw_output.stdout
تقسيم إلى قائمة نصوص
lines = str(sh.ls()).split('\n')
for line in lines:
if line.strip():
print(line)
إدارة الأخطاء
توفر مكتبة Sh آليات قوية لمعالجة الأخطاء: