【问题标题】:Python subprocess + mencoder not working, same command works in terminalPython subprocess + mencoder 不起作用,相同的命令在终端中起作用
【发布时间】:2010-08-04 16:42:01
【问题描述】:

我在通过 python (2.6.1) 子进程使用 mencoder (SVN-r30531-4.2.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"

它不起作用,它只是无限期地挂起。但是,当我通过终端(OS X 10.6.4)运行完全相同的命令时,它可以工作。命令是:

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

您可以下载视频from here。我很有信心这些视频不是问题,因为它可以在终端上运行。

【问题讨论】:

    标签: python video subprocess mp4 mencoder


    【解决方案1】:

    这里的问题是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,(不要使用readlines(),因为它会阻塞,直到所有行都被读取):

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

    这会将标准错误重定向到标准输出,因此您的缓冲区不会填满。

    【讨论】:

    • 谢谢!这就是导致问题的原因。
    猜你喜欢
    • 2018-09-01
    • 2013-08-25
    • 2012-11-27
    • 2021-06-06
    • 2015-03-14
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多