2011-09-10 6 views
3

나는 다음과 같은 명령이 : 나는 파이썬 변수에이 명령의 출력을 설정하기 위해 노력하고있어파이썬 하위 프로세스로 복잡한 명령을 변환

$ ffmpeg -i http://url/1video.mp4 2>&1 | perl -lane 'print $1 if /(\d+x\d+)/' 
640x360 

합니다. 여기에 내가 지금까지 가지고있는 것입니다 :

>>> from subprocess import Popen, PIPE 
>>> p1 = Popen(['ffmpeg', '-i', 'http://url/1video.mp4', '2>&1'], stdout=PIPE) 
>>> p2=Popen(['perl','-lane','print $1 if /(\d+x\d+)/'], stdin=p1.stdout, stdout=PIPE) 
>>> dimensions = p2.communicate()[0] 
'' 

여기에서 내가 뭘 잘못하고 있으며 치수에 올바른 값을 얻을 수 있습니까? 일반적으로

+0

나는 perl을 모르지만, 펄 인터프리터를 생성하지 않고도 파이썬에서 그렇게 할 수있을 것이라고 확신한다. 해결책을 찾으려면'2> & 1'을 삭제 해보십시오. – utdemir

답변

3

,이 패턴 replace a shell pipeline 수 :

p1 = Popen(["dmesg"], stdout=PIPE) 
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
output = p2.communicate()[0] 

그러나이 경우에는 파이프 라인이 필요하지 않습니다 :

import subprocess 
import shlex 
import re 
url='http://url/1video.mp4' 
proc=subprocess.Popen(shlex.split('ffmpeg -i {f}'.format(f=url)), 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 
dimensions=None 
for line in proc.stderr: 
    match=re.search(r'(\d+x\d+)',line) 
    if match: 
     dimensions=match.group(1) 
     break 
print(dimensions) 
+1

니스! 아마도 shlex-trick이 설명 된 [docs.python.org] (http://docs.python.org/library/subprocess.html#using-the-subprocess-module) 링크를 추가 하시겠습니까? –

+0

훌륭합니다. 고맙습니다. – David542

3

파이썬 내에서 perl를 호출 할 필요가 있습니다.

print re.search(r'(\d+x\d+)', str).group() 
0

주 subprocess.Popen에 "쉘"인수 : 당신이 변수는 FFmpeg의 출력이있는 경우

, 당신은 이런 식으로 뭔가를 할 수있는이 당신이 전달하는 명령으로 해석할지 여부를 지정합니다 껍질 또는 아닙니다. "2> & 1"은 셸에서 구문 분석해야하는 것 중 하나입니다. 그렇지 않으면 FFmpeg (대부분의 프로그램과 마찬가지로)가 파일 이름이나 옵션 값으로 처리하려고 시도합니다. 가장 근접하게 원래 아마 될 모방

파이썬 시퀀스 이상의 추천

P1 = subprocess.Popen ("는 FFmpeg -i http://url/1video.mp4 2> 1 &", 쉘 = TRUE, 표준 출력 = subprocess.PIPE)
p2 = subprocess.Popen (r "perl -lane '/ (\ d + x \ d +) /'"이면 쉘 = True, stdin = p1.stdout, stdout = subprocess.PIPE)
치수 = p2 .communicate() [0]