Python子进程+mencoder不工作,同一个命令在termin中工作

2024-09-23 22:32:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我在通过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"

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

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

您可以下载视频from here。我很有信心这些视频不是问题所在,因为它是从终端工作的。在


Tags: ofoutmp4subprocessprintcopypipein1
1条回答
网友
1楼 · 发布于 2024-09-23 22:32:03

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

^{pr2}$

这会将stderr重定向到stdout,这样缓冲区就不会被填满。在

相关问题 更多 >