2011-02-15 6 views
2

Je suis en train d'assembler des images avec un appel à montage de ImageMagick à partir d'un script Python comme ceci:Python, ImageMagick et `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]) 

Cependant, le montage montre que l'utilisation. Si je lance la commande manuellement, tout fonctionne. ImageMagick est censé prendre en charge la globalisation de nom de fichier dans Windows, ainsi * .png est développé. Mais apparemment, ce comportement est supprimé par subprocess. Dois-je utiliser glob pour alimenter montage avec une liste de noms de fichiers?

Autres informations Merci jusqu'à présent. Mais même quand je l'utilise:

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']) 

Je reçois une erreur:

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

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

+0

Problème persistant avec ImageMagick-6.6.7-7-Q16-windows-dll.exe. – none

+0

Notez le retour en arrière dans le message d'erreur \ "

+0

'-tile' et 'widthxheight' doivent être deux éléments de liste différents. La même chose vaut pour tout sur la ligne de commande qui est séparée par un espace. Les seuls espaces qui devraient être présents dans les éléments de la liste sont ceux que vous pourriez échapper si vous deviez exécuter la commande directement. –

Répondre

3

Au lieu de [command, args], vous devez passer ['montage', '-tile', '{}x{}'.format(...), '-geometry'...] comme premier argument. Vous pourriez aussi avoir besoin de shell=True.

+1

Avant que quelqu'un d'autre le rate: Notez que même les arguments ({} x {}) aux options (-tile) sont des éléments de liste séparés! – none

+0

J'avais besoin de 'shell = True' pour que le mien fonctionne (en utilisant' convert') – paul

+0

Mise à jour: 'shell = True' le corrigeait sur Windows 7 mais OS X (10.6) en avait besoin sans. – paul

0

subprocess.call s'attend à ce que la commande entière soit scindée en une liste (avec chaque argument en tant qu'élément séparé de la liste). Essayez:

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 déjà vous a donné la solution, mais vous ne l'avez pas lu attentivement;)

Ceci est incorrect:

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

Ceci est correct:

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

Maintenant je comprends. Merci – none