2010-08-04 78 views
0

我有一个问题,通过python(2.6.1)子进程使用mencoder(SVN-r30531-4.2.1)。我试图加入两个完全相同大小的mp4文件,编解码器等。两者都没有音频。我用来测试的代码是:Python子进程+ mencoder不工作,相同的命令在终端工作

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。我非常有信心这些视频不是问题,因为它在终端上运行。

回答

2

这里的问题是,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 

另一种选择,让您阅读输出线,由线是标准错误重定向到标准输出,然后只读标准输出,(不要使用readlines方法(),因为它阻止,直到所有行被读取):

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

这stderr重定向到标准输出,所以你的缓冲区将不会继续进行。

+0

谢谢!这是导致问题的原因。 – betamax 2010-08-05 11:26:25