طباعة بايثون إلى stdout تضيع في مهام المجموعة الفاشلة

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

سؤال

لدي كود بايثون الذي أقوم بتشغيله على مجموعة كمبيوتر.الإخراج الافتراضي (stdout, ، من print) يضيع عندما يفشل الكود (أو يتم إلغاؤه، وما إلى ذلك).كما أنه لا يظهر في ملف الإخراج عندما أسميه مباشرة بعد استدعاء الجزء المقابل من التعليمات البرمجية.

إخراج الخطأ (stderr) ومع ذلك، تتم طباعته عند فشل المهمة.إذا كنت أتذكر بشكل صحيح، في C++ يمكنك ذلك flush التدفقات للتأكد من أن المخرجات العالقة في المخزن المؤقت في مكان ما تتم طباعتها بالفعل.هل هناك تناظرية للبايثون؟كيف يمكنني التأكد من الحصول على هذا الناتج في أسرع وقت ممكن؟


تمثيل تخطيطي للكود الخاص بي

for it in somerange:
    print "Iteration", it       # This appears much later in stdout
    f = open(filename[it], 'w')
    f.write('stuff')
    f.close                     # file appears when it is closed
    otherStuff()

بعد عدة تكرارات، سيكون لدي العديد من ملفات الإخراج (من filename)، ولكن لا يوجد إخراج في ملفي stdout ملف.إذا كانت الوظيفة otherStuff() كانت للتسبب في تعطل (الخ)، والإخراج سوف تظهر في بلدي stderr ملف - ولكن لا يوجد شيء في ملفي stdout ملف.

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

المحلول

حسنا، لذلك print يذهب إلى sys.stdout وهو أ كائن الملف, ، والتي يمكنك استخدام flush() يأمر.لذا فإن الإجابة الصحيحة هي الإضافة flush() يدعو عند الحاجة، أي.

import sys
...
for it in somerange:
    print "Iteration", it       # This appears much later in stdout
    sys.stdout.flush()
    f = open(filename[it], 'w')
    f.write('stuff')
    f.close                     # file appears when it is closed
    otherStuff()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top