بايثون:لماذا لا يتم استدعاء `sys.exit(msg)` من سلسلة محادثات ولا تتم طباعة `msg` إلى stderr؟

StackOverflow https://stackoverflow.com/questions/1209155

سؤال

اليوم ركضت ضد حقيقة ذلك sys.exit() يتم استدعاؤه من خيط فرعي لا يقتل العملية الرئيسية.لم أكن أعرف هذا من قبل، ولا بأس بذلك، لكني كنت بحاجة إلى وقت طويل لأدرك ذلك.كان من شأنه أن ينقذ الكثير من الوقت, ، لو sys.exit(msg) سيكون قد طبع msg ل stderr.ولكنها لم تفعل.

اتضح أن ذلك لم يكن خطأً حقيقيًا في طلبي؛دعا sys.exit(msg) مع وجود خطأ ذو معنى بطريقة إرادية -- لكنني لم أتمكن من رؤية هذا.

في المستندات ل sys.exit() لقد نصت: "[...] تتم طباعة أي كائن آخر sys.stderr وينتج عنه رمز خروج 1"

هذا هو غير صحيح لمكالمة من موضوع الطفل، حيث sys.exit() من الواضح أنه يتصرف كما thread.exit(): "رفع الاستثناء SystemExit.عندما لا يتم الإمساك به، سيؤدي ذلك إلى خروج الخيط بصمت"

أعتقد عندما يريد مبرمج sys.exit(msg) لطباعة رسالة خطأ، فيجب طباعة هذه الرسالة - بغض النظر عن المكان الذي يتم استدعاؤها منه.ولم لا؟حاليا لا أرى أي سبب.على الأقل يجب أن يكون هناك تلميح في المستندات لـ sys.exit() أن الرسالة لا تتم طباعتها من المواضيع.

ماذا تعتقد؟لماذا يتم إخفاء رسائل الخطأ من المواضيع؟هل لهذا معنى؟

أطيب التحيات،

جان فيليب جيركي

هل كانت مفيدة؟

المحلول

أوافق على أن مستندات Python غير صحيحة، أو ربما غير مكتملة بشكل أكثر دقة، فيما يتعلق بـ sys.exit وSystemExit عند استدعائها/رفعها بواسطة سلاسل رسائل أخرى غير الموضوع الرئيسي؛الرجاء فتح مشكلة مستند على متتبع Python عبر الإنترنت حتى يمكن معالجة ذلك في تكرار مستقبلي للمستندات (ربما في المستقبل القريب - إصلاحات المستندات أسهل وأكثر سلاسة من إصلاحات التعليمات البرمجية؛-).

العلاج سهل جدًا بالطبع - ما عليك سوى تغليف أي وظيفة تستخدمها كهدف لـ threading.Thread مع مصمم الديكور الذي يفعل try/except SystemExit, e: حوله، وينفذ وظيفة "الكتابة إلى stderr" الإضافية التي تحتاجها (أو ربما أفضل، يستخدم استدعاء logging.error بدلاً من ذلك) قبل الإنهاء.ولكن، مع مشكلة المستند التي أشرت إليها بشكل صحيح، من الصعب التفكير في القيام بذلك إلا إذا واجه الشخص المشكلة واضطر في الواقع إلى قضاء بعض الوقت في تصحيح الأخطاء لتحديدها، كما كان عليك أن تفعل ذلك افعل (نيابة عن مطوري بايثون الأساسيين - آسف!).

نصائح أخرى

ليست كل المواضيع في بايثون متساوية.استدعاء sys.exit من سلسلة رسائل، لا يؤدي فعليًا إلى الخروج من النظام.وبالتالي، فإن استدعاء sys.exit() من سلسلة فرعية أمر غير منطقي، لذلك فمن المنطقي أنه لا يتصرف بالطريقة التي تتوقعها.

هذا صفحة يتحدث أكثر عن كائنات الترابط، والاختلافات بين الخيوط والخيط "الرئيسي" الخاص.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top