首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python子进程+ mencoder不工作,同样的命令在终端工作

Python子进程+ mencoder不工作,同样的命令在终端工作
EN

Stack Overflow用户
提问于 2010-08-05 00:42:02
回答 1查看 651关注 0票数 0

我在通过python (2.6.1)子进程使用mencoder (SVN-r30531-4.2.1)时遇到了问题。我试图加入两个mp4文件,这是完全相同的大小,编解码器等。两者都没有音频。我用来测试的代码是:

代码语言:javascript
复制
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 10.6.4)运行完全相同的命令时,它可以工作。该命令为:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-05 01:10:07

这里的问题是pMerge.stderr.readlines()会永远阻塞,直到这个过程结束。它在继续之前读取所有行。

由于mencoder向stdout写入了大量内容,因此stdout缓冲区已被填满,mencoder等待它清空,然后才能继续。所以这个过程永远不会结束。

这里有一种同样的方法,它不会挂起:

代码语言:javascript
复制
pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
    stderr=subprocess.PIPE)
stdout, stderr = pMerge.communicate()
print stdout
print stderr

允许逐行读取输出的另一个选项是将stderr重定向到stdout,然后只读stdout()(不要使用readline(),因为它会阻塞,直到读取完所有行):

代码语言:javascript
复制
pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT)
for line in pMerge.stdout:
    print line,

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3407742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档