طباعة بايثون إلى stdout تضيع في مهام المجموعة الفاشلة
سؤال
لدي كود بايثون الذي أقوم بتشغيله على مجموعة كمبيوتر.الإخراج الافتراضي (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()