Pythonのサブプロセス+ mencoderの作業ではない、同じコマンドは、端末で動作します

StackOverflow https://stackoverflow.com/questions/3407742

質問

私は、Python(2.6.1)サブプロセスを通じてmencoderの(SVN-r30531-4.2.1)を使用して、問題が発生しています。私は2つの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

あなたはをこちらからの動画をダウンロードすることができます。私はビデオがあるため、それはターミナルから働くという事実をprobelmではありませんかなり確信しています。

役に立ちましたか?

解決

プロセスが終わるまでここでの問題は、そのpMerge.stderr.readlines()ブロックは永遠です。これは、読み込みのすべてのの続行する前に行ます。

mencoderのはstdoutに多くのことを書き込みますので、標準出力バッファが満たされると、それは続けることができます前に、それが空にするためにmencoderのが待っています。プロセスが終了することはありませんので。

ここでハングアップしないであろうこと、同じことを行うための方法です。

pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
    stderr=subprocess.PIPE)
stdout, stderr = pMerge.communicate()
print stdout
print stderr

は、出力ライン・バイ・ラインを読むことができます別のオプションは、(すべての行が読み込まれるまでブロックするので)(readlinesを使用しない)、標準出力へのリダイレクトstderrにあり、その後、唯一の標準出力読み:

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

このリダイレクトは、あなたのバッファがいっぱいありませんので、標準出力に標準エラーます。

scroll top