الناتج الفرعي غير المقيد (السطر الأخير مفقود)

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

  •  19-09-2019
  •  | 
  •  

سؤال

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

process = subprocess.Popen(args, shell = True,  
                           stdout = subprocess.PIPE, stderr = subprocess.PIPE)

# None indicates that the process hasn't terminated yet.
while process.poll() is None:

    # Always save the last non-emtpy line that was output by the child
    # process, as it will write an empty line when closing its stdout.
    out = process.stdout.readline()
    if out:
        last_non_empty_line = out

    if verbose:
        sys.stdout.write(out)   
        sys.stdout.flush()

# Parse 'out' here...

مرة واحدة في حين، ومع ذلك، لا يتم طباعة السطر الأخير. القيمة الافتراضية للملصقات bufsize. هو 0، لذلك من المفترض أن يكون غير محدود. لقد حاولت أيضا، دون جدوى، مضيفا fflush (stdout) إلى رمز C قبل الخروج، ولكن يبدو أنه لا توجد حاجة مطلقا لطرد دفق قبل الخروج من البرنامج.

أفكار أي شخص؟

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

المحلول

readline() يجب أن تخزن النص، في انتظار خط جديد.

سيكون لديك دائما حالة سباق - لا توجد مبلغ من التدفقات المخزنة للأمم المتحدة سوف تتعامل مع حقيقة أنك تتعامل مع خط، ثم تحقق من الخروج، ثم اقرأ سطرا، لذلك إذا تمخر الإعداد الفرعي أثناء التعامل مع خط ، لن تقرأ أي شيء آخر. بالإضافة إلى ذلك، من المحتمل أن تكون قذيفة تقديم التخزين المؤقت الخاص بها.

لذلك يمكنك إما:

  1. يستخدم communicate() والتخلي عن الإخراج المطلي أثناء تشغيل البرنامج الفرعي.

  2. تأكد من استمرار القراءة بعد خروج العملية، حتى تحصل على EOF.

أود أيضا أن أقترح تغيير الكود الخاص بك حتى لا تضطر إلى استخدام shell=True.

نصائح أخرى

المشكلة هي أنك تقرأ الخطوط حتى تخطئ العملية، (process.poll()) أثناء استخدام التخزين المؤقت بسبب علم Shell.

يجب عليك الاحتفاظ بقراءة العملية. التثبيت حتى تصل إلى نهاية الملف أو السطر الفارغ.

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