Python的子+ mencoder的不工作,同样的命令在终端工作
-
25-09-2019 - |
题
我有一个使用问题的mencoder(SVN-r30531-4.2.1)通过一个Python(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"
和它不工作,它只是无限期挂起。然而,当我通过终端运行相同的指令(OS X 10.6.4),它的工作原理。的命令是:
mencoder in1.mp4 in2.mp4 -ovc copy -oac copy -of lavf -o out.mp4
您可以从这里下载视频。我确信影片不是万阿英,蒋达清,因为它从终端工作的事实。
解决方案
这里的问题是,pMerge.stderr.readlines()
块永远直到过程结束。它读取所有的线,然后再继续。
由于mencoder的写了很多的标准输出,标准输出缓冲器被填充和MEncoder正在等待它清空,然后才能继续。所以该过程从未结束。
下面是一个方式做同样的,不会挂:
pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = pMerge.communicate()
print stdout
print stderr
另一个,允许你读取输出行由行选项是把stderr重定向到stdout,然后只读标准输出,(不使用readlines方法(),因为它的块,直到所有的行被读取):
pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
for line in pMerge.stdout:
print line,
此重定向标准错误到stdout所以你的缓冲器不会继续进行。
不隶属于 StackOverflow