Pythonのサブプロセス+ mencoderの作業ではない、同じコマンドは、端末で動作します
-
25-09-2019 - |
質問
私は、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,
このリダイレクトは、あなたのバッファがいっぱいありませんので、標準出力に標準エラーます。