تقنية

subprocess في بايثون: هل رسالة stderr تعني الفشل؟

النص والرمز
الاقتباس يوضح النص الفارغ. [1] [2]

لا تحكم من stderr وحده. [1] [2]

الخلاصة السريعة

النص الملتقط يختلف عن رمز الخروج. [1] [2]

  • برنامجنا الأول يكتب note وينتهي بـ0؛ الثاني صامت وينتهي بـ7. [1] [2] [3]
  • capture_output=True يلتقط النص؛ لا يفعل فحص الرمز. [1] [2]
  • مع check=True: الصفر يعيد نتيجة، و7 يرفع CalledProcessError. [1] [2]
  • text=True يجعل المخرج الملتقط نصًا. [1] [2]
  • اختبرنا 3.12.14؛ الصفر لا يثبت صحة عمل البرنامج. [1] [2]

المثال

import subprocess as s,sys
for rc,msg in[(0,'note'),(7,'')]:
 code='import sys;'
 code+='sys.stderr.write('
 code+=repr(msg)+');'
 code+='sys.exit('+str(rc)+')'
 r=s.run(
 [sys.executable,'-c',code],
 capture_output=True,text=True)
 print(r.returncode,
 repr(r.stderr))

[1] [2] [3]

الناتج: 0 'note' ثم 7 ''. [1] [2]

استخدمنا الالتقاط ووضع النص؛ لذلك stderr نص في المثال. [1] [2]

الفحص

إضافة check=True للاستدعاء ترفض الرمز غير الصفري، لا مجرد وجود رسالة. [1] [2]

فحص رمز الخروج
نتيجتا check=True في مثالنا. [1] [2]

التفسير

في مثالنا stderr فارغ للرمز 7؛ عدم النص لا يلغي هذا الرمز. الصفر ليس اختبارًا لمحتوى العمل. [1] [2]

نفرق وثائق 3.15 من المفسر المختبر؛ شغّلنا برامجنا المؤلفة دون مفسر أوامر أو خدمة خارجية. [1] [2]

المراجع

  1. Python: subprocess
  2. CPython 3.12.14: subprocess.py
  3. Python: sys
  4. موضوع تك: لغة بايثون — مفردات
  5. موضوع تك: تطبيقات بايثون — مفردات

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