Python Subprocess + Mencoder لا يعمل ، نفس الأمر يعمل في المحطة

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

سؤال

أواجه مشكلة في استخدام Mencoder (SVN-R30531-4.2.1) من خلال عملية ثعبان (2.6.1). أحاول الانضمام إلى ملفين MP4 وهما بنفس الحجم ، وبرنامج الترميز ، وما إلى ذلك ، لا يوجد لدى كلاهما صوت. الرمز الذي أستخدمه للاختبار هو:

import subprocess

mp4merge = [ "mencoder", "in1.mp4", "in2.mp4", "-ovc", "copy", "-oac", "copy", "-of", "lavf", "-o", "out.mp4" ]

try:

    pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    while pMerge.poll() == None:

        for l in pMerge.stderr.readlines():
            print l

    if pMerge.poll() is not None:

        print "Complete"

except subprocess.CalledProcessError:
    print "fail"

وهو لا يعمل ، إنه معلق إلى أجل غير مسمى. ومع ذلك ، عندما أقوم بتشغيل نفس الأمر بالضبط من خلال Terminal (OS X 10.6.4) فهو يعمل. الأمر هو:

mencoder in1.mp4 in2.mp4 -ovc copy -oac copy -of lavf -o out.mp4

يمكنك تنزيل مقاطع الفيديو من هنا. أنا واثق تمامًا من أن مقاطع الفيديو ليست هي المحتملة بسبب حقيقة أنها تعمل من المحطة.

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

المحلول

المشكلة هنا هي ذلك pMerge.stderr.readlines() كتل إلى الأبد حتى تنتهي العملية. تقرأ الكل خطوط قبل المتابعة.

نظرًا لأن Mencoder يكتب كثيرًا إلى stdout ، فإن المخزن المؤقت stdout ممتلئ وينتظر Mencoder فارغه قبل أن يتمكن من المتابعة. لذا فإن العملية لا تنتهي أبدًا.

إليك طريقة لفعل الشيء نفسه ، لن يتم تعليقه:

pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
    stderr=subprocess.PIPE)
stdout, stderr = pMerge.communicate()
print stdout
print stderr

هناك خيار آخر يسمح لك بقراءة خط الإخراج على حدة هو إعادة توجيه STDERR إلى stdout ، ثم قراءة stdout فقط ، (لا تستخدم الخطوط القراءة () لأنه يتم حظره حتى يتم قراءة جميع الخطوط):

pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT)
for line in pMerge.stdout:
    print line,

هذا يعيد توجيه Stderr إلى stdout حتى لا تملأ المخزن المؤقت الخاص بك.

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