2011-02-15 4 views
2

ImageMagick의 montage 호출을 사용하여 다음과 같은 Python 스크립트에서 이미지를 어셈블하려고합니다.Python, ImageMagick 및`subprocess`

 command = "montage" 
args = "-tile {}x{} -geometry +0+0 \"*.png\" out.png".format(width, height) 
sys.stdout.write(" {} {}\n".format(command, args)) 
print subprocess.call([command, args]) 

그러나 몽타주는 사용법만을 보여줍니다. 명령을 수동으로 실행하면 모든 것이 작동합니다. ImageMagick은 Windows에서 파일명 globbing을 지원하기 때문에 * .png가 확장됩니다. 하지만 분명히이 동작은 subprocess에 의해 억제됩니다. glob를 사용하여 montage에 파일 이름 목록을 제공해야합니까?

추가 정보 지금까지 감사드립니다. 그러나 내가 사용하는 경우에도 :

command = "montage" 
tile = "-tile {}x{}".format(width, height) 
geometry = "-geometry +0+0" 
infile = "*.png" 
outfile = "out.png" 
sys.stdout.write(" {} {} {} {} {}\n".format(command, tile, geometry, infile, outfile)) 
print [command, tile, geometry, infile, outfile] 
#~ print subprocess.call([command, tile, geometry, infile, outfile]) 
print subprocess.call(['montage', '-tile 9x6', '-geometry +0+0', '*.png', 'out.png']) 

오류가 발생합니다 :

 Magick: unrecognized option `-tile 9x6' @ error/montage.c/MontageImageCommand/1631. 

Windows 7, ImageMagick 6.6.5-7 2010-11-05 Q16 http://www.imagemagick.org, Python 2.7

+0

ImageMagick-6.6.7-7-Q16-windows-dll.exe에서 문제가 지속됩니다. – none

+0

오류 메시지 \'

+0

'타일'및 '너비 x 높이'는 서로 다른 두 개의 목록 항목이어야합니다. 공백으로 구분 된 명령 줄의 모든 내용이 동일하게 적용됩니다. 목록 항목 내에 존재해야하는 유일한 공백은 명령을 직접 실행하면 탈출 할 수있는 공백입니다. –

답변

3

[command, args] 대신 ['montage', '-tile', '{}x{}'.format(...), '-geometry'...]을 첫 번째 인수로 전달해야합니다. shell=True이 필요할 수도 있습니다.

+1

다른 누구도 그리워하기 전에 : 옵션 (-tile)에 대한 인수 ({} x {})는 별도의 목록 요소라는 점에 유의하십시오! – none

+0

광산이 작동하려면'shell = True'가 필요합니다 ('convert' 사용). – paul

+0

업데이트 :'shell = True'는 Windows 7에서 수정되었지만 OS X (10.6)은 필요하지 않습니다. – paul

0

subprocess.call은 전체 명령이 목록으로 분리되고 (각 인수가 목록의 개별 요소로) 예상됩니다. 시도 :;

import shlex 
command = "montage" 
args = "-tile {}x{} -geometry +0+0 \"*.png\" out.png".format(width, height) 
subprocess.call(shlex.split('{} {}'.format(command, args))) 
3

JD 이미 당신에게 해결책을 준,하지만 당신은주의 깊게 읽어 보지 않았

이 잘못된 것은) :

subprocess.call(['montage', '-tile 9x6', '-geometry +0+0', '*.png', 'out.png']) 

이 올바른 것입니다 :

subprocess.call(['montage', '-tile', '9x6', '-geometry', '+0+0', '*.png', 'out.png']) 
+0

이제 알겠습니다. 감사 – none